deploy: 844c45076f4604385c38150b552e72fe3f651790
authorsystemcrash <systemcrash@users.noreply.github.com>
Fri, 20 Dec 2024 00:14:58 +0000 (00:14 +0000)
committersystemcrash <systemcrash@users.noreply.github.com>
Fri, 20 Dec 2024 00:14:58 +0000 (00:14 +0000)
65 files changed:
jsapi/LuCI.baseclass.html
jsapi/LuCI.dom.html
jsapi/LuCI.form.AbstractElement.html
jsapi/LuCI.form.AbstractSection.html
jsapi/LuCI.form.AbstractValue.html
jsapi/LuCI.form.ButtonValue.html
jsapi/LuCI.form.DummyValue.html
jsapi/LuCI.form.DynamicList.html
jsapi/LuCI.form.FileUpload.html
jsapi/LuCI.form.FlagValue.html
jsapi/LuCI.form.GridSection.html
jsapi/LuCI.form.HiddenValue.html
jsapi/LuCI.form.JSONMap.html
jsapi/LuCI.form.ListValue.html
jsapi/LuCI.form.Map.html
jsapi/LuCI.form.MultiValue.html
jsapi/LuCI.form.NamedSection.html
jsapi/LuCI.form.RichListValue.html
jsapi/LuCI.form.SectionValue.html
jsapi/LuCI.form.TableSection.html
jsapi/LuCI.form.TextValue.html
jsapi/LuCI.form.TypedSection.html
jsapi/LuCI.form.Value.html
jsapi/LuCI.form.html
jsapi/LuCI.fs.html
jsapi/LuCI.headers.html
jsapi/LuCI.html
jsapi/LuCI.network.Device.html
jsapi/LuCI.network.Hosts.html
jsapi/LuCI.network.Protocol.html
jsapi/LuCI.network.WifiDevice.html
jsapi/LuCI.network.WifiNetwork.html
jsapi/LuCI.network.html
jsapi/LuCI.poll.html
jsapi/LuCI.request.html
jsapi/LuCI.request.poll.html
jsapi/LuCI.response.html
jsapi/LuCI.rpc.html
jsapi/LuCI.session.html
jsapi/LuCI.uci.html
jsapi/LuCI.ui.AbstractElement.html
jsapi/LuCI.ui.Checkbox.html
jsapi/LuCI.ui.ComboButton.html
jsapi/LuCI.ui.Combobox.html
jsapi/LuCI.ui.Dropdown.html
jsapi/LuCI.ui.DynamicList.html
jsapi/LuCI.ui.FileUpload.html
jsapi/LuCI.ui.Hiddenfield.html
jsapi/LuCI.ui.Select.html
jsapi/LuCI.ui.Textarea.html
jsapi/LuCI.ui.Textfield.html
jsapi/LuCI.ui.changes.html
jsapi/LuCI.ui.html
jsapi/LuCI.ui.menu.html
jsapi/LuCI.ui.tabs.html
jsapi/LuCI.view.html
jsapi/LuCI.xhr.html
jsapi/form.js.html
jsapi/fs.js.html
jsapi/index.html
jsapi/luci.js.html
jsapi/network.js.html
jsapi/rpc.js.html
jsapi/uci.js.html
jsapi/ui.js.html

index c14e9c0ce9a47f9e0cd4a24a1b6c9e20e51cb5f5..8d89c0465ea70b55339ca2d92c3dc5c1abbd5115 100644 (file)
@@ -86,6 +86,8 @@
             
                 <li data-name="LuCI#hasViewPermission"><a href="LuCI.html#hasViewPermission">hasViewPermission</a></li>
             
+                <li data-name="LuCI#isArguments"><a href="LuCI.html#isArguments">isArguments</a></li>
+            
                 <li data-name="LuCI#isObject"><a href="LuCI.html#isObject">isObject</a></li>
             
                 <li data-name="LuCI#location"><a href="LuCI.html#location">location</a></li>
@@ -3664,7 +3666,7 @@ implements prototypal inheritance.</p></div>
     
         
         <div class="tag-source">
-            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line61">line 61</a>
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line23">line 23</a>
         </div>
         
     </div>
@@ -3749,7 +3751,7 @@ implements prototypal inheritance.</p></div>
     
         
         <div class="tag-source">
-            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line89">line 89</a>
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line55">line 55</a>
         </div>
         
     </div>
@@ -3894,12 +3896,12 @@ class constructor and can be instantiated with <code>new</code>.</td>
     <div class="nameContainer">
         <h4 class="name" id=".instantiate">
             
-            <span class="type-signature static">static</span>LuCI.baseclass.instantiate<span class="signature">(params, <span class="optional">new_args</span>)</span><span class="glyphicon glyphicon-circle-arrow-right"></span><span class="type-signature returnType">{<a href="LuCI.baseclass.html">LuCI.baseclass</a>}</span>
+            <span class="type-signature static">static</span>LuCI.baseclass.instantiate<span class="signature">(params)</span><span class="glyphicon glyphicon-circle-arrow-right"></span><span class="type-signature returnType">{<a href="LuCI.baseclass.html">LuCI.baseclass</a>}</span>
         </h4>
     
         
         <div class="tag-source">
-            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line172">line 172</a>
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line133">line 133</a>
         </div>
         
     </div>
@@ -3958,49 +3960,11 @@ array being passed as variadic parameters to the constructor.</p>
             
             <td class="description last">
                 
-                    
-                    
-                        
-                    
-                
                 <p>An array of arbitrary values which will be passed as arguments
 to the constructor function.</p></td>
         </tr>
        
        
-       
-        <tr>
-            
-                <td class="name"><code>new_args</code></td>
-            
-            
-            <td class="type">
-            
-                
-<span class="param-type">*</span>
-
-
-            
-            </td>
-            
-            
-            
-            <td class="description last">
-                
-                    
-                        <span class="optional">optional</span>
-                    
-                    
-                        
-                    
-                        <span class="repeatable">repeatable</span>
-                    
-                
-                <p>Specifies arguments to be passed to the subclass constructor
-as-is in order to instantiate the new subclass.</p></td>
-        </tr>
-       
-       
        </tbody>
 </table>
     
@@ -4086,7 +4050,7 @@ enable inheritance.</td>
     
         
         <div class="tag-source">
-            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line198">line 198</a>
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line158">line 158</a>
         </div>
         
     </div>
@@ -4233,7 +4197,7 @@ a subclass of this class'.</td>
     
         
         <div class="tag-source">
-            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line148">line 148</a>
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line114">line 114</a>
         </div>
         
     </div>
@@ -4425,7 +4389,7 @@ enable inheritance.</td>
     
         
         <div class="tag-source">
-            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line270">line 270</a>
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line227">line 227</a>
         </div>
         
     </div>
@@ -4655,7 +4619,7 @@ superclass method returned <code>null</code>.</td>
     
         
         <div class="tag-source">
-            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line228">line 228</a>
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line186">line 186</a>
         </div>
         
     </div>
@@ -4878,7 +4842,7 @@ and the values extracted from the <code>args</code> array beginning with
         
 
         <footer>
-            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Thu Dec 19 2024 19:20:35 GMT+0000 (Coordinated Universal Time)
+            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Fri Dec 20 2024 00:14:55 GMT+0000 (Coordinated Universal Time)
         </footer>
     </div>
 </div>
index 1844b1f65a1d9b19dc32e5fd55029878b70633c1..76d07aa733dd90128ce7c4012df0249b4205c1fc 100644 (file)
@@ -86,6 +86,8 @@
             
                 <li data-name="LuCI#hasViewPermission"><a href="LuCI.html#hasViewPermission">hasViewPermission</a></li>
             
+                <li data-name="LuCI#isArguments"><a href="LuCI.html#isArguments">isArguments</a></li>
+            
                 <li data-name="LuCI#isObject"><a href="LuCI.html#isObject">isObject</a></li>
             
                 <li data-name="LuCI#location"><a href="LuCI.html#location">location</a></li>
@@ -3665,7 +3667,7 @@ external JavaScript, use <code>L.require(&quot;dom&quot;).then(...)</code>.</p><
     
         
         <div class="tag-source">
-            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line1207">line 1207</a>
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line1160">line 1160</a>
         </div>
         
     </div>
@@ -3750,7 +3752,7 @@ external JavaScript, use <code>L.require(&quot;dom&quot;).then(...)</code>.</p><
     
         
         <div class="tag-source">
-            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line1361">line 1361</a>
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line1311">line 1311</a>
         </div>
         
     </div>
@@ -3951,7 +3953,7 @@ if either the <code>node</code> argument was no valid DOM <code>node</code> or i
     
         
         <div class="tag-source">
-            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line1476">line 1476</a>
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line1426">line 1426</a>
         </div>
         
     </div>
@@ -4149,7 +4151,7 @@ call implicitly turning it into a string.</p></td>
     
         
         <div class="tag-source">
-            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line1713">line 1713</a>
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line1663">line 1663</a>
         </div>
         
     </div>
@@ -4350,7 +4352,7 @@ a valid Class instance.</p>
     
         
         <div class="tag-source">
-            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line1767">line 1767</a>
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line1717">line 1717</a>
         </div>
         
     </div>
@@ -4566,7 +4568,7 @@ instance didn't have the requested <code>method</code>.</td>
     
         
         <div class="tag-source">
-            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line1428">line 1428</a>
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line1378">line 1378</a>
         </div>
         
     </div>
@@ -4770,7 +4772,7 @@ if either the <code>node</code> argument was no valid DOM <code>node</code> or i
     
         
         <div class="tag-source">
-            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line1554">line 1554</a>
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line1504">line 1504</a>
         </div>
         
     </div>
@@ -5030,7 +5032,7 @@ element names, such as spaces.</p>
     
         
         <div class="tag-source">
-            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line1630">line 1630</a>
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line1580">line 1580</a>
         </div>
         
     </div>
@@ -5269,7 +5271,7 @@ be found.</td>
     
         
         <div class="tag-source">
-            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line1233">line 1233</a>
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line1186">line 1186</a>
         </div>
         
     </div>
@@ -5414,7 +5416,7 @@ be found.</td>
     
         
         <div class="tag-source">
-            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line1733">line 1733</a>
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line1683">line 1683</a>
         </div>
         
     </div>
@@ -5564,7 +5566,7 @@ class could be found on the node itself or any of its parents.</td>
     
         
         <div class="tag-source">
-            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line1813">line 1813</a>
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line1763">line 1763</a>
         </div>
         
     </div>
@@ -5751,7 +5753,7 @@ result when testing it using the given <code>ignoreFn</code>.</td>
     
         
         <div class="tag-source">
-            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line1285">line 1285</a>
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line1235">line 1235</a>
         </div>
         
     </div>
@@ -5937,7 +5939,7 @@ selector didn't match.</td>
     
         
         <div class="tag-source">
-            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line1312">line 1312</a>
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line1262">line 1262</a>
         </div>
         
     </div>
@@ -6127,7 +6129,7 @@ selector didn't match any parent.</td>
     
         
         <div class="tag-source">
-            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line1252">line 1252</a>
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line1205">line 1205</a>
         </div>
         
     </div>
@@ -6282,7 +6284,7 @@ the first <code>div</code> element node.</p></td>
     
         
         <div class="tag-source">
-            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line1776">line 1776</a>
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line1726">line 1726</a>
         </div>
         
     </div>
@@ -6436,7 +6438,7 @@ ignored, else not.</p>
         
 
         <footer>
-            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Thu Dec 19 2024 19:20:35 GMT+0000 (Coordinated Universal Time)
+            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Fri Dec 20 2024 00:14:55 GMT+0000 (Coordinated Universal Time)
         </footer>
     </div>
 </div>
index adc7b05f6089ce8791f987355249d4da95bc8bfe..a653d1fb863139272d18786793f0ef6913d713c1 100644 (file)
@@ -86,6 +86,8 @@
             
                 <li data-name="LuCI#hasViewPermission"><a href="LuCI.html#hasViewPermission">hasViewPermission</a></li>
             
+                <li data-name="LuCI#isArguments"><a href="LuCI.html#isArguments">isArguments</a></li>
+            
                 <li data-name="LuCI#isObject"><a href="LuCI.html#isObject">isObject</a></li>
             
                 <li data-name="LuCI#location"><a href="LuCI.html#location">location</a></li>
@@ -3666,7 +3668,7 @@ properties.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line184">line 184</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line186">line 186</a>
         </div>
         
     </div>
@@ -3751,7 +3753,7 @@ properties.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line210">line 210</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line212">line 212</a>
         </div>
         
     </div>
@@ -3867,7 +3869,7 @@ properties.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line228">line 228</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line230">line 230</a>
         </div>
         
     </div>
@@ -3973,7 +3975,7 @@ respective elements.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line246">line 246</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line248">line 248</a>
         </div>
         
     </div>
@@ -4079,7 +4081,7 @@ the form element's markup, including the markup of any child elements.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line288">line 288</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line289">line 289</a>
         </div>
         
     </div>
@@ -4226,7 +4228,7 @@ entities decoded.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line327">line 327</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line328">line 328</a>
         </div>
         
     </div>
@@ -4427,7 +4429,7 @@ was neither a string nor a function.</td>
         
 
         <footer>
-            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Thu Dec 19 2024 19:20:35 GMT+0000 (Coordinated Universal Time)
+            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Fri Dec 20 2024 00:14:55 GMT+0000 (Coordinated Universal Time)
         </footer>
     </div>
 </div>
index 8c8ffd73fd4cd2e973876181dc6e14055011a897..7bfe00aec4391cfe5ae95c3ecc98bf767ca7c1ae 100644 (file)
@@ -86,6 +86,8 @@
             
                 <li data-name="LuCI#hasViewPermission"><a href="LuCI.html#hasViewPermission">hasViewPermission</a></li>
             
+                <li data-name="LuCI#isArguments"><a href="LuCI.html#isArguments">isArguments</a></li>
+            
                 <li data-name="LuCI#isObject"><a href="LuCI.html#isObject">isObject</a></li>
             
                 <li data-name="LuCI#location"><a href="LuCI.html#location">location</a></li>
@@ -3666,7 +3668,7 @@ form options and for handling tabs to segment child options.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line815">line 815</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line819">line 819</a>
         </div>
         
     </div>
@@ -3811,7 +3813,7 @@ this property will hold a reference to the parent option instance.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line210">line 210</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line212">line 212</a>
         </div>
         
     </div>
@@ -3927,7 +3929,7 @@ this property will hold a reference to the parent option instance.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line866">line 866</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line870">line 870</a>
         </div>
         
     </div>
@@ -4055,7 +4057,7 @@ The sections will be rendered in the same order as the returned array.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1085">line 1085</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1090">line 1090</a>
         </div>
         
     </div>
@@ -4251,7 +4253,7 @@ on the amount of passed arguments.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line889">line 889</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line893">line 893</a>
         </div>
         
     </div>
@@ -4403,7 +4405,7 @@ custom implementations.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1118">line 1118</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1123">line 1123</a>
         </div>
         
     </div>
@@ -4599,7 +4601,7 @@ on the amount of passed arguments.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1184">line 1184</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1189">line 1189</a>
         </div>
         
     </div>
@@ -4764,7 +4766,7 @@ depending on the amount of passed arguments.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1154">line 1154</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1159">line 1159</a>
         </div>
         
     </div>
@@ -4957,7 +4959,7 @@ on the amount of passed arguments.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line904">line 904</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line908">line 908</a>
         </div>
         
     </div>
@@ -5061,7 +5063,7 @@ elements load functions rejected with an error.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1017">line 1017</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1021">line 1021</a>
         </div>
         
     </div>
@@ -5276,7 +5278,7 @@ descendant of <code>AbstractValue</code>.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line933">line 933</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line937">line 937</a>
         </div>
         
     </div>
@@ -5384,7 +5386,7 @@ not meeting the validation constraints of their respective elements.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line246">line 246</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line248">line 248</a>
         </div>
         
     </div>
@@ -5492,7 +5494,7 @@ the form element's markup, including the markup of any child elements.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line288">line 288</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line289">line 289</a>
         </div>
         
     </div>
@@ -5639,7 +5641,7 @@ entities decoded.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line974">line 974</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line978">line 978</a>
         </div>
         
     </div>
@@ -5856,7 +5858,7 @@ contents. If omitted, no description will be rendered.</p></td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1054">line 1054</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1058">line 1058</a>
         </div>
         
     </div>
@@ -6125,7 +6127,7 @@ descendant of <code>AbstractValue</code>.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line327">line 327</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line328">line 328</a>
         </div>
         
     </div>
@@ -6326,7 +6328,7 @@ was neither a string nor a function.</td>
         
 
         <footer>
-            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Thu Dec 19 2024 19:20:35 GMT+0000 (Coordinated Universal Time)
+            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Fri Dec 20 2024 00:14:55 GMT+0000 (Coordinated Universal Time)
         </footer>
     </div>
 </div>
index b520ab104154417b0fc035fd324546be85696467..96f9381c9d5729caf9b697e450680869d21bd161 100644 (file)
@@ -86,6 +86,8 @@
             
                 <li data-name="LuCI#hasViewPermission"><a href="LuCI.html#hasViewPermission">hasViewPermission</a></li>
             
+                <li data-name="LuCI#isArguments"><a href="LuCI.html#isArguments">isArguments</a></li>
+            
                 <li data-name="LuCI#isObject"><a href="LuCI.html#isObject">isObject</a></li>
             
                 <li data-name="LuCI#location"><a href="LuCI.html#location">location</a></li>
@@ -3666,7 +3668,7 @@ validation constraints that should be applied to entered values.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1328">line 1328</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1333">line 1333</a>
         </div>
         
     </div>
@@ -4489,7 +4491,7 @@ table section elements.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line210">line 210</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line212">line 212</a>
         </div>
         
     </div>
@@ -4605,7 +4607,7 @@ table section elements.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1752">line 1752</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1758">line 1758</a>
         </div>
         
     </div>
@@ -4781,7 +4783,7 @@ within the given specific section.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1826">line 1826</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1832">line 1832</a>
         </div>
         
     </div>
@@ -4957,7 +4959,7 @@ different way.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1634">line 1634</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1639">line 1639</a>
         </div>
         
     </div>
@@ -4989,20 +4991,20 @@ constraint evaluation. The associated value of these special &quot;tag&quot; key
 is ignored. The recognized tags are:</p>
 <ul>
   <li>
-   <code>!reverse</code><br>
-   Invert the dependency, instead of requiring another option to be
-   equal to the dependency value, that option should <em>not</em> be
-   equal.
+       <code>!reverse</code><br>
+       Invert the dependency, instead of requiring another option to be
+       equal to the dependency value, that option should <em>not</em> be
+       equal.
   </li>
   <li>
-   <code>!contains</code><br>
-   Instead of requiring an exact match, the dependency is considered
-   satisfied when the dependency value is contained within the option
-   value.
+       <code>!contains</code><br>
+       Instead of requiring an exact match, the dependency is considered
+       satisfied when the dependency value is contained within the option
+       value.
   </li>
   <li>
-   <code>!default</code><br>
-   The dependency is always satisfied
+       <code>!default</code><br>
+       The dependency is always satisfied
   </li>
 </ul>
 <p>Examples:</p>
@@ -5026,7 +5028,7 @@ is ignored. The recognized tags are:</p>
  </li>
  <li>
   <code>opt.depends({ foo: "test" })<br>
-        opt.depends({ bar: "qrx" })</code><br>
+                opt.depends({ bar: "qrx" })</code><br>
   Require either <code>foo</code> to be set to <code>test</code>,
   <em>or</em> the <code>bar</code> option to be <code>qrx</code>.
  </li>
@@ -5176,7 +5178,7 @@ argument, this parameter is ignored.</p></td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1854">line 1854</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1860">line 1860</a>
         </div>
         
     </div>
@@ -5351,7 +5353,7 @@ It may be overwritten by user code to handle input values differently.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1803">line 1803</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1809">line 1809</a>
         </div>
         
     </div>
@@ -5527,7 +5529,7 @@ option implementation does not use <code>LuCI.ui</code> widgets.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1941">line 1941</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1947">line 1947</a>
         </div>
         
     </div>
@@ -5672,7 +5674,7 @@ option implementation does not use <code>LuCI.ui</code> widgets.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1959">line 1959</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1965">line 1965</a>
         </div>
         
     </div>
@@ -5820,7 +5822,7 @@ returns <code>false</code>.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1927">line 1927</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1933">line 1933</a>
         </div>
         
     </div>
@@ -5966,7 +5968,7 @@ returns <code>false</code>.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1780">line 1780</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1786">line 1786</a>
         </div>
         
     </div>
@@ -6147,7 +6149,7 @@ so it may return promises if overridden by user code.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line2000">line 2000</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line2006">line 2006</a>
         </div>
         
     </div>
@@ -6296,7 +6298,7 @@ validation constraints.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line2080">line 2080</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line2086">line 2086</a>
         </div>
         
     </div>
@@ -6421,7 +6423,7 @@ implement alternative removal logic, e.g. to retain the original value.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line246">line 246</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line248">line 248</a>
         </div>
         
     </div>
@@ -6529,7 +6531,7 @@ the form element's markup, including the markup of any child elements.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line288">line 288</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line289">line 289</a>
         </div>
         
     </div>
@@ -6676,7 +6678,7 @@ entities decoded.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1878">line 1878</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1884">line 1884</a>
         </div>
         
     </div>
@@ -6856,7 +6858,7 @@ state of checkbox elements.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line327">line 327</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line328">line 328</a>
         </div>
         
     </div>
@@ -7049,7 +7051,7 @@ was neither a string nor a function.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1913">line 1913</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1919">line 1919</a>
         </div>
         
     </div>
@@ -7225,7 +7227,7 @@ as error message to the user.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line2057">line 2057</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line2063">line 2063</a>
         </div>
         
     </div>
@@ -7384,7 +7386,7 @@ before it is written.</p>
         
 
         <footer>
-            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Thu Dec 19 2024 19:20:35 GMT+0000 (Coordinated Universal Time)
+            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Fri Dec 20 2024 00:14:55 GMT+0000 (Coordinated Universal Time)
         </footer>
     </div>
 </div>
index 2eaa57a0e729db271f8d02af6ebd8b14a77ae175..ebba9edda34cfa459af9ed99ca0a150c032bbde7 100644 (file)
@@ -86,6 +86,8 @@
             
                 <li data-name="LuCI#hasViewPermission"><a href="LuCI.html#hasViewPermission">hasViewPermission</a></li>
             
+                <li data-name="LuCI#isArguments"><a href="LuCI.html#isArguments">isArguments</a></li>
+            
                 <li data-name="LuCI#isObject"><a href="LuCI.html#isObject">isObject</a></li>
             
                 <li data-name="LuCI#location"><a href="LuCI.html#location">location</a></li>
@@ -3663,7 +3665,7 @@ renders the underlying UCI option or default value as readonly text.</p></div>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line4523">line 4523</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line4539">line 4539</a>
         </div>
         
     </div>
@@ -4922,7 +4924,7 @@ table section elements.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line210">line 210</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line212">line 212</a>
         </div>
         
     </div>
@@ -5040,7 +5042,7 @@ table section elements.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1752">line 1752</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1758">line 1758</a>
         </div>
         
     </div>
@@ -5218,7 +5220,7 @@ within the given specific section.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1826">line 1826</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1832">line 1832</a>
         </div>
         
     </div>
@@ -5396,7 +5398,7 @@ different way.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1634">line 1634</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1639">line 1639</a>
         </div>
         
     </div>
@@ -5428,20 +5430,20 @@ constraint evaluation. The associated value of these special &quot;tag&quot; key
 is ignored. The recognized tags are:</p>
 <ul>
   <li>
-   <code>!reverse</code><br>
-   Invert the dependency, instead of requiring another option to be
-   equal to the dependency value, that option should <em>not</em> be
-   equal.
+       <code>!reverse</code><br>
+       Invert the dependency, instead of requiring another option to be
+       equal to the dependency value, that option should <em>not</em> be
+       equal.
   </li>
   <li>
-   <code>!contains</code><br>
-   Instead of requiring an exact match, the dependency is considered
-   satisfied when the dependency value is contained within the option
-   value.
+       <code>!contains</code><br>
+       Instead of requiring an exact match, the dependency is considered
+       satisfied when the dependency value is contained within the option
+       value.
   </li>
   <li>
-   <code>!default</code><br>
-   The dependency is always satisfied
+       <code>!default</code><br>
+       The dependency is always satisfied
   </li>
 </ul>
 <p>Examples:</p>
@@ -5465,7 +5467,7 @@ is ignored. The recognized tags are:</p>
  </li>
  <li>
   <code>opt.depends({ foo: "test" })<br>
-        opt.depends({ bar: "qrx" })</code><br>
+                opt.depends({ bar: "qrx" })</code><br>
   Require either <code>foo</code> to be set to <code>test</code>,
   <em>or</em> the <code>bar</code> option to be <code>qrx</code>.
  </li>
@@ -5617,7 +5619,7 @@ argument, this parameter is ignored.</p></td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1854">line 1854</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1860">line 1860</a>
         </div>
         
     </div>
@@ -5794,7 +5796,7 @@ It may be overwritten by user code to handle input values differently.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1803">line 1803</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1809">line 1809</a>
         </div>
         
     </div>
@@ -5972,7 +5974,7 @@ option implementation does not use <code>LuCI.ui</code> widgets.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1941">line 1941</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1947">line 1947</a>
         </div>
         
     </div>
@@ -6119,7 +6121,7 @@ option implementation does not use <code>LuCI.ui</code> widgets.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1959">line 1959</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1965">line 1965</a>
         </div>
         
     </div>
@@ -6269,7 +6271,7 @@ returns <code>false</code>.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1927">line 1927</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1933">line 1933</a>
         </div>
         
     </div>
@@ -6417,7 +6419,7 @@ returns <code>false</code>.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1780">line 1780</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1786">line 1786</a>
         </div>
         
     </div>
@@ -6600,7 +6602,7 @@ so it may return promises if overridden by user code.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line2000">line 2000</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line2006">line 2006</a>
         </div>
         
     </div>
@@ -6751,7 +6753,7 @@ validation constraints.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line2080">line 2080</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line2086">line 2086</a>
         </div>
         
     </div>
@@ -6876,7 +6878,7 @@ implement alternative removal logic, e.g. to retain the original value.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line288">line 288</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line289">line 289</a>
         </div>
         
     </div>
@@ -7025,7 +7027,7 @@ entities decoded.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1878">line 1878</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1884">line 1884</a>
         </div>
         
     </div>
@@ -7205,7 +7207,7 @@ state of checkbox elements.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line327">line 327</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line328">line 328</a>
         </div>
         
     </div>
@@ -7400,7 +7402,7 @@ was neither a string nor a function.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line3671">line 3671</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line3686">line 3686</a>
         </div>
         
     </div>
@@ -7548,7 +7550,7 @@ or a plain text string. If omitted, the <code>key</code> value is used as captio
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line2057">line 2057</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line2063">line 2063</a>
         </div>
         
     </div>
@@ -7707,7 +7709,7 @@ before it is written.</p>
         
 
         <footer>
-            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Thu Dec 19 2024 19:20:35 GMT+0000 (Coordinated Universal Time)
+            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Fri Dec 20 2024 00:14:55 GMT+0000 (Coordinated Universal Time)
         </footer>
     </div>
 </div>
index 199a48fb08be6d4835a12c12c44431e7bac1c4b9..53ee030ea346ebf5b6850bdf9e57e69fbd594be0 100644 (file)
@@ -86,6 +86,8 @@
             
                 <li data-name="LuCI#hasViewPermission"><a href="LuCI.html#hasViewPermission">hasViewPermission</a></li>
             
+                <li data-name="LuCI#isArguments"><a href="LuCI.html#isArguments">isArguments</a></li>
+            
                 <li data-name="LuCI#isObject"><a href="LuCI.html#isObject">isObject</a></li>
             
                 <li data-name="LuCI#location"><a href="LuCI.html#location">location</a></li>
@@ -3663,7 +3665,7 @@ renders the underlying UCI option or default value as readonly text.</p></div>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line4431">line 4431</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line4447">line 4447</a>
         </div>
         
     </div>
@@ -4908,7 +4910,7 @@ table section elements.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line210">line 210</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line212">line 212</a>
         </div>
         
     </div>
@@ -5026,7 +5028,7 @@ table section elements.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1752">line 1752</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1758">line 1758</a>
         </div>
         
     </div>
@@ -5204,7 +5206,7 @@ within the given specific section.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1826">line 1826</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1832">line 1832</a>
         </div>
         
     </div>
@@ -5382,7 +5384,7 @@ different way.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1634">line 1634</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1639">line 1639</a>
         </div>
         
     </div>
@@ -5414,20 +5416,20 @@ constraint evaluation. The associated value of these special &quot;tag&quot; key
 is ignored. The recognized tags are:</p>
 <ul>
   <li>
-   <code>!reverse</code><br>
-   Invert the dependency, instead of requiring another option to be
-   equal to the dependency value, that option should <em>not</em> be
-   equal.
+       <code>!reverse</code><br>
+       Invert the dependency, instead of requiring another option to be
+       equal to the dependency value, that option should <em>not</em> be
+       equal.
   </li>
   <li>
-   <code>!contains</code><br>
-   Instead of requiring an exact match, the dependency is considered
-   satisfied when the dependency value is contained within the option
-   value.
+       <code>!contains</code><br>
+       Instead of requiring an exact match, the dependency is considered
+       satisfied when the dependency value is contained within the option
+       value.
   </li>
   <li>
-   <code>!default</code><br>
-   The dependency is always satisfied
+       <code>!default</code><br>
+       The dependency is always satisfied
   </li>
 </ul>
 <p>Examples:</p>
@@ -5451,7 +5453,7 @@ is ignored. The recognized tags are:</p>
  </li>
  <li>
   <code>opt.depends({ foo: "test" })<br>
-        opt.depends({ bar: "qrx" })</code><br>
+                opt.depends({ bar: "qrx" })</code><br>
   Require either <code>foo</code> to be set to <code>test</code>,
   <em>or</em> the <code>bar</code> option to be <code>qrx</code>.
  </li>
@@ -5603,7 +5605,7 @@ argument, this parameter is ignored.</p></td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1854">line 1854</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1860">line 1860</a>
         </div>
         
     </div>
@@ -5780,7 +5782,7 @@ It may be overwritten by user code to handle input values differently.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1803">line 1803</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1809">line 1809</a>
         </div>
         
     </div>
@@ -5958,7 +5960,7 @@ option implementation does not use <code>LuCI.ui</code> widgets.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1941">line 1941</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1947">line 1947</a>
         </div>
         
     </div>
@@ -6105,7 +6107,7 @@ option implementation does not use <code>LuCI.ui</code> widgets.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1959">line 1959</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1965">line 1965</a>
         </div>
         
     </div>
@@ -6255,7 +6257,7 @@ returns <code>false</code>.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1927">line 1927</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1933">line 1933</a>
         </div>
         
     </div>
@@ -6403,7 +6405,7 @@ returns <code>false</code>.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1780">line 1780</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1786">line 1786</a>
         </div>
         
     </div>
@@ -6586,7 +6588,7 @@ so it may return promises if overridden by user code.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line2000">line 2000</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line2006">line 2006</a>
         </div>
         
     </div>
@@ -6737,7 +6739,7 @@ validation constraints.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line4517">line 4517</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line4533">line 4533</a>
         </div>
         
     </div>
@@ -6862,7 +6864,7 @@ implement alternative removal logic, e.g. to retain the original value.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line288">line 288</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line289">line 289</a>
         </div>
         
     </div>
@@ -7011,7 +7013,7 @@ entities decoded.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1878">line 1878</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1884">line 1884</a>
         </div>
         
     </div>
@@ -7191,7 +7193,7 @@ state of checkbox elements.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line327">line 327</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line328">line 328</a>
         </div>
         
     </div>
@@ -7386,7 +7388,7 @@ was neither a string nor a function.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line3671">line 3671</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line3686">line 3686</a>
         </div>
         
     </div>
@@ -7534,7 +7536,7 @@ or a plain text string. If omitted, the <code>key</code> value is used as captio
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line4520">line 4520</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line4536">line 4536</a>
         </div>
         
     </div>
@@ -7693,7 +7695,7 @@ before it is written.</p>
         
 
         <footer>
-            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Thu Dec 19 2024 19:20:35 GMT+0000 (Coordinated Universal Time)
+            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Fri Dec 20 2024 00:14:55 GMT+0000 (Coordinated Universal Time)
         </footer>
     </div>
 </div>
index 6e8463afc69fe4f27b37fd1c91887ae65c21871d..7360661c87ef28001cc200ef225936bc145d0d74 100644 (file)
@@ -86,6 +86,8 @@
             
                 <li data-name="LuCI#hasViewPermission"><a href="LuCI.html#hasViewPermission">hasViewPermission</a></li>
             
+                <li data-name="LuCI#isArguments"><a href="LuCI.html#isArguments">isArguments</a></li>
+            
                 <li data-name="LuCI#isObject"><a href="LuCI.html#isObject">isObject</a></li>
             
                 <li data-name="LuCI#location"><a href="LuCI.html#location">location</a></li>
@@ -3664,7 +3666,7 @@ predefined choices. It builds upon the <a href="LuCI.ui.DynamicList.html"><code>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line3816">line 3816</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line3831">line 3831</a>
         </div>
         
     </div>
@@ -4759,7 +4761,7 @@ table section elements.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line210">line 210</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line212">line 212</a>
         </div>
         
     </div>
@@ -4877,7 +4879,7 @@ table section elements.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1752">line 1752</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1758">line 1758</a>
         </div>
         
     </div>
@@ -5055,7 +5057,7 @@ within the given specific section.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1826">line 1826</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1832">line 1832</a>
         </div>
         
     </div>
@@ -5233,7 +5235,7 @@ different way.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1634">line 1634</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1639">line 1639</a>
         </div>
         
     </div>
@@ -5265,20 +5267,20 @@ constraint evaluation. The associated value of these special &quot;tag&quot; key
 is ignored. The recognized tags are:</p>
 <ul>
   <li>
-   <code>!reverse</code><br>
-   Invert the dependency, instead of requiring another option to be
-   equal to the dependency value, that option should <em>not</em> be
-   equal.
+       <code>!reverse</code><br>
+       Invert the dependency, instead of requiring another option to be
+       equal to the dependency value, that option should <em>not</em> be
+       equal.
   </li>
   <li>
-   <code>!contains</code><br>
-   Instead of requiring an exact match, the dependency is considered
-   satisfied when the dependency value is contained within the option
-   value.
+       <code>!contains</code><br>
+       Instead of requiring an exact match, the dependency is considered
+       satisfied when the dependency value is contained within the option
+       value.
   </li>
   <li>
-   <code>!default</code><br>
-   The dependency is always satisfied
+       <code>!default</code><br>
+       The dependency is always satisfied
   </li>
 </ul>
 <p>Examples:</p>
@@ -5302,7 +5304,7 @@ is ignored. The recognized tags are:</p>
  </li>
  <li>
   <code>opt.depends({ foo: "test" })<br>
-        opt.depends({ bar: "qrx" })</code><br>
+                opt.depends({ bar: "qrx" })</code><br>
   Require either <code>foo</code> to be set to <code>test</code>,
   <em>or</em> the <code>bar</code> option to be <code>qrx</code>.
  </li>
@@ -5454,7 +5456,7 @@ argument, this parameter is ignored.</p></td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1854">line 1854</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1860">line 1860</a>
         </div>
         
     </div>
@@ -5631,7 +5633,7 @@ It may be overwritten by user code to handle input values differently.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1803">line 1803</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1809">line 1809</a>
         </div>
         
     </div>
@@ -5809,7 +5811,7 @@ option implementation does not use <code>LuCI.ui</code> widgets.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1941">line 1941</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1947">line 1947</a>
         </div>
         
     </div>
@@ -5956,7 +5958,7 @@ option implementation does not use <code>LuCI.ui</code> widgets.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1959">line 1959</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1965">line 1965</a>
         </div>
         
     </div>
@@ -6106,7 +6108,7 @@ returns <code>false</code>.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1927">line 1927</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1933">line 1933</a>
         </div>
         
     </div>
@@ -6254,7 +6256,7 @@ returns <code>false</code>.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1780">line 1780</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1786">line 1786</a>
         </div>
         
     </div>
@@ -6437,7 +6439,7 @@ so it may return promises if overridden by user code.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line2000">line 2000</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line2006">line 2006</a>
         </div>
         
     </div>
@@ -6588,7 +6590,7 @@ validation constraints.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line2080">line 2080</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line2086">line 2086</a>
         </div>
         
     </div>
@@ -6713,7 +6715,7 @@ implement alternative removal logic, e.g. to retain the original value.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line288">line 288</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line289">line 289</a>
         </div>
         
     </div>
@@ -6862,7 +6864,7 @@ entities decoded.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1878">line 1878</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1884">line 1884</a>
         </div>
         
     </div>
@@ -7042,7 +7044,7 @@ state of checkbox elements.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line327">line 327</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line328">line 328</a>
         </div>
         
     </div>
@@ -7237,7 +7239,7 @@ was neither a string nor a function.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line3671">line 3671</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line3686">line 3686</a>
         </div>
         
     </div>
@@ -7385,7 +7387,7 @@ or a plain text string. If omitted, the <code>key</code> value is used as captio
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line2057">line 2057</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line2063">line 2063</a>
         </div>
         
     </div>
@@ -7544,7 +7546,7 @@ before it is written.</p>
         
 
         <footer>
-            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Thu Dec 19 2024 19:20:35 GMT+0000 (Coordinated Universal Time)
+            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Fri Dec 20 2024 00:14:55 GMT+0000 (Coordinated Universal Time)
         </footer>
     </div>
 </div>
index 450e09707d970ff98b71c9550c89e878c8d21ba5..c7bf0b2451163d2089746677d97bc476756dc846 100644 (file)
@@ -86,6 +86,8 @@
             
                 <li data-name="LuCI#hasViewPermission"><a href="LuCI.html#hasViewPermission">hasViewPermission</a></li>
             
+                <li data-name="LuCI#isArguments"><a href="LuCI.html#isArguments">isArguments</a></li>
+            
                 <li data-name="LuCI#isObject"><a href="LuCI.html#isObject">isObject</a></li>
             
                 <li data-name="LuCI#location"><a href="LuCI.html#location">location</a></li>
@@ -3663,7 +3665,7 @@ offers the ability to browse, upload and select remote files.</p></div>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line4690">line 4690</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line4706">line 4706</a>
         </div>
         
     </div>
@@ -5066,7 +5068,7 @@ table section elements.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line210">line 210</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line212">line 212</a>
         </div>
         
     </div>
@@ -5184,7 +5186,7 @@ table section elements.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1752">line 1752</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1758">line 1758</a>
         </div>
         
     </div>
@@ -5362,7 +5364,7 @@ within the given specific section.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1826">line 1826</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1832">line 1832</a>
         </div>
         
     </div>
@@ -5540,7 +5542,7 @@ different way.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1634">line 1634</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1639">line 1639</a>
         </div>
         
     </div>
@@ -5572,20 +5574,20 @@ constraint evaluation. The associated value of these special &quot;tag&quot; key
 is ignored. The recognized tags are:</p>
 <ul>
   <li>
-   <code>!reverse</code><br>
-   Invert the dependency, instead of requiring another option to be
-   equal to the dependency value, that option should <em>not</em> be
-   equal.
+       <code>!reverse</code><br>
+       Invert the dependency, instead of requiring another option to be
+       equal to the dependency value, that option should <em>not</em> be
+       equal.
   </li>
   <li>
-   <code>!contains</code><br>
-   Instead of requiring an exact match, the dependency is considered
-   satisfied when the dependency value is contained within the option
-   value.
+       <code>!contains</code><br>
+       Instead of requiring an exact match, the dependency is considered
+       satisfied when the dependency value is contained within the option
+       value.
   </li>
   <li>
-   <code>!default</code><br>
-   The dependency is always satisfied
+       <code>!default</code><br>
+       The dependency is always satisfied
   </li>
 </ul>
 <p>Examples:</p>
@@ -5609,7 +5611,7 @@ is ignored. The recognized tags are:</p>
  </li>
  <li>
   <code>opt.depends({ foo: "test" })<br>
-        opt.depends({ bar: "qrx" })</code><br>
+                opt.depends({ bar: "qrx" })</code><br>
   Require either <code>foo</code> to be set to <code>test</code>,
   <em>or</em> the <code>bar</code> option to be <code>qrx</code>.
  </li>
@@ -5761,7 +5763,7 @@ argument, this parameter is ignored.</p></td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1854">line 1854</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1860">line 1860</a>
         </div>
         
     </div>
@@ -5938,7 +5940,7 @@ It may be overwritten by user code to handle input values differently.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1803">line 1803</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1809">line 1809</a>
         </div>
         
     </div>
@@ -6116,7 +6118,7 @@ option implementation does not use <code>LuCI.ui</code> widgets.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1941">line 1941</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1947">line 1947</a>
         </div>
         
     </div>
@@ -6263,7 +6265,7 @@ option implementation does not use <code>LuCI.ui</code> widgets.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1959">line 1959</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1965">line 1965</a>
         </div>
         
     </div>
@@ -6413,7 +6415,7 @@ returns <code>false</code>.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1927">line 1927</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1933">line 1933</a>
         </div>
         
     </div>
@@ -6561,7 +6563,7 @@ returns <code>false</code>.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1780">line 1780</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1786">line 1786</a>
         </div>
         
     </div>
@@ -6744,7 +6746,7 @@ so it may return promises if overridden by user code.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line2000">line 2000</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line2006">line 2006</a>
         </div>
         
     </div>
@@ -6895,7 +6897,7 @@ validation constraints.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line2080">line 2080</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line2086">line 2086</a>
         </div>
         
     </div>
@@ -7020,7 +7022,7 @@ implement alternative removal logic, e.g. to retain the original value.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line288">line 288</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line289">line 289</a>
         </div>
         
     </div>
@@ -7169,7 +7171,7 @@ entities decoded.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1878">line 1878</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1884">line 1884</a>
         </div>
         
     </div>
@@ -7349,7 +7351,7 @@ state of checkbox elements.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line327">line 327</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line328">line 328</a>
         </div>
         
     </div>
@@ -7544,7 +7546,7 @@ was neither a string nor a function.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line3671">line 3671</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line3686">line 3686</a>
         </div>
         
     </div>
@@ -7692,7 +7694,7 @@ or a plain text string. If omitted, the <code>key</code> value is used as captio
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line2057">line 2057</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line2063">line 2063</a>
         </div>
         
     </div>
@@ -7851,7 +7853,7 @@ before it is written.</p>
         
 
         <footer>
-            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Thu Dec 19 2024 19:20:35 GMT+0000 (Coordinated Universal Time)
+            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Fri Dec 20 2024 00:14:55 GMT+0000 (Coordinated Universal Time)
         </footer>
     </div>
 </div>
index 73fd622d734d556f8a20230f0396d6abf2ad0159..c2332b0152cf85e06fc2d02ac8f7fcf41ece00c5 100644 (file)
@@ -86,6 +86,8 @@
             
                 <li data-name="LuCI#hasViewPermission"><a href="LuCI.html#hasViewPermission">hasViewPermission</a></li>
             
+                <li data-name="LuCI#isArguments"><a href="LuCI.html#isArguments">isArguments</a></li>
+            
                 <li data-name="LuCI#isObject"><a href="LuCI.html#isObject">isObject</a></li>
             
                 <li data-name="LuCI#location"><a href="LuCI.html#location">location</a></li>
@@ -3663,7 +3665,7 @@ implement a simple checkbox element.</p></div>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line4092">line 4092</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line4107">line 4107</a>
         </div>
         
     </div>
@@ -4956,7 +4958,7 @@ table section elements.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line210">line 210</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line212">line 212</a>
         </div>
         
     </div>
@@ -5074,7 +5076,7 @@ table section elements.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1752">line 1752</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1758">line 1758</a>
         </div>
         
     </div>
@@ -5252,7 +5254,7 @@ within the given specific section.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1826">line 1826</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1832">line 1832</a>
         </div>
         
     </div>
@@ -5430,7 +5432,7 @@ different way.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1634">line 1634</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1639">line 1639</a>
         </div>
         
     </div>
@@ -5462,20 +5464,20 @@ constraint evaluation. The associated value of these special &quot;tag&quot; key
 is ignored. The recognized tags are:</p>
 <ul>
   <li>
-   <code>!reverse</code><br>
-   Invert the dependency, instead of requiring another option to be
-   equal to the dependency value, that option should <em>not</em> be
-   equal.
+       <code>!reverse</code><br>
+       Invert the dependency, instead of requiring another option to be
+       equal to the dependency value, that option should <em>not</em> be
+       equal.
   </li>
   <li>
-   <code>!contains</code><br>
-   Instead of requiring an exact match, the dependency is considered
-   satisfied when the dependency value is contained within the option
-   value.
+       <code>!contains</code><br>
+       Instead of requiring an exact match, the dependency is considered
+       satisfied when the dependency value is contained within the option
+       value.
   </li>
   <li>
-   <code>!default</code><br>
-   The dependency is always satisfied
+       <code>!default</code><br>
+       The dependency is always satisfied
   </li>
 </ul>
 <p>Examples:</p>
@@ -5499,7 +5501,7 @@ is ignored. The recognized tags are:</p>
  </li>
  <li>
   <code>opt.depends({ foo: "test" })<br>
-        opt.depends({ bar: "qrx" })</code><br>
+                opt.depends({ bar: "qrx" })</code><br>
   Require either <code>foo</code> to be set to <code>test</code>,
   <em>or</em> the <code>bar</code> option to be <code>qrx</code>.
  </li>
@@ -5651,7 +5653,7 @@ argument, this parameter is ignored.</p></td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line4204">line 4204</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line4219">line 4219</a>
         </div>
         
     </div>
@@ -5827,7 +5829,7 @@ the checked state.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1803">line 1803</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1809">line 1809</a>
         </div>
         
     </div>
@@ -6005,7 +6007,7 @@ option implementation does not use <code>LuCI.ui</code> widgets.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1941">line 1941</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1947">line 1947</a>
         </div>
         
     </div>
@@ -6152,7 +6154,7 @@ option implementation does not use <code>LuCI.ui</code> widgets.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1959">line 1959</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1965">line 1965</a>
         </div>
         
     </div>
@@ -6302,7 +6304,7 @@ returns <code>false</code>.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1927">line 1927</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1933">line 1933</a>
         </div>
         
     </div>
@@ -6450,7 +6452,7 @@ returns <code>false</code>.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1780">line 1780</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1786">line 1786</a>
         </div>
         
     </div>
@@ -6633,7 +6635,7 @@ so it may return promises if overridden by user code.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line4226">line 4226</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line4241">line 4241</a>
         </div>
         
     </div>
@@ -6784,7 +6786,7 @@ validation constraints.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line2080">line 2080</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line2086">line 2086</a>
         </div>
         
     </div>
@@ -6909,7 +6911,7 @@ implement alternative removal logic, e.g. to retain the original value.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line288">line 288</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line289">line 289</a>
         </div>
         
     </div>
@@ -7058,7 +7060,7 @@ entities decoded.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line4216">line 4216</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line4231">line 4231</a>
         </div>
         
     </div>
@@ -7233,7 +7235,7 @@ either a localized <code>Yes</code> or <code>No</code> string, depending on the
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line327">line 327</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line328">line 328</a>
         </div>
         
     </div>
@@ -7428,7 +7430,7 @@ was neither a string nor a function.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line3671">line 3671</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line3686">line 3686</a>
         </div>
         
     </div>
@@ -7576,7 +7578,7 @@ or a plain text string. If omitted, the <code>key</code> value is used as captio
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line2057">line 2057</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line2063">line 2063</a>
         </div>
         
     </div>
@@ -7735,7 +7737,7 @@ before it is written.</p>
         
 
         <footer>
-            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Thu Dec 19 2024 19:20:35 GMT+0000 (Coordinated Universal Time)
+            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Fri Dec 20 2024 00:14:55 GMT+0000 (Coordinated Universal Time)
         </footer>
     </div>
 </div>
index 1725d59d70950c36885d0af96e8e5f1fe3b1a054..c0ebcf3d3a4f0b972cdf8dc7ad567f306bff6075 100644 (file)
@@ -86,6 +86,8 @@
             
                 <li data-name="LuCI#hasViewPermission"><a href="LuCI.html#hasViewPermission">hasViewPermission</a></li>
             
+                <li data-name="LuCI#isArguments"><a href="LuCI.html#isArguments">isArguments</a></li>
+            
                 <li data-name="LuCI#isObject"><a href="LuCI.html#isObject">isObject</a></li>
             
                 <li data-name="LuCI#location"><a href="LuCI.html#location">location</a></li>
@@ -3676,7 +3678,7 @@ documentation for details.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line3282">line 3282</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line3294">line 3294</a>
         </div>
         
     </div>
@@ -4637,7 +4639,7 @@ The default is <code>null</code>, means inheriting from the parent form.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line3131">line 3131</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line3143">line 3143</a>
         </div>
         
     </div>
@@ -4840,7 +4842,7 @@ is shown.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line210">line 210</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line212">line 212</a>
         </div>
         
     </div>
@@ -4958,7 +4960,7 @@ is shown.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1085">line 1085</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1090">line 1090</a>
         </div>
         
     </div>
@@ -5156,7 +5158,7 @@ on the amount of passed arguments.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line889">line 889</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line893">line 893</a>
         </div>
         
     </div>
@@ -5310,7 +5312,7 @@ custom implementations.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1118">line 1118</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1123">line 1123</a>
         </div>
         
     </div>
@@ -5508,7 +5510,7 @@ on the amount of passed arguments.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1184">line 1184</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1189">line 1189</a>
         </div>
         
     </div>
@@ -5675,7 +5677,7 @@ depending on the amount of passed arguments.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1154">line 1154</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1159">line 1159</a>
         </div>
         
     </div>
@@ -5870,7 +5872,7 @@ on the amount of passed arguments.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line904">line 904</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line908">line 908</a>
         </div>
         
     </div>
@@ -5976,7 +5978,7 @@ elements load functions rejected with an error.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1017">line 1017</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1021">line 1021</a>
         </div>
         
     </div>
@@ -6193,7 +6195,7 @@ descendant of <code>AbstractValue</code>.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line3437">line 3437</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line3450">line 3450</a>
         </div>
         
     </div>
@@ -6301,7 +6303,7 @@ not meeting the validation constraints of their respective elements.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line288">line 288</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line289">line 289</a>
         </div>
         
     </div>
@@ -6448,7 +6450,7 @@ entities decoded.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line3351">line 3351</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line3363">line 3363</a>
         </div>
         
     </div>
@@ -6666,7 +6668,7 @@ contents. If omitted, no description will be rendered.</p></td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1054">line 1054</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1058">line 1058</a>
         </div>
         
     </div>
@@ -6935,7 +6937,7 @@ descendant of <code>AbstractValue</code>.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line327">line 327</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line328">line 328</a>
         </div>
         
     </div>
@@ -7136,7 +7138,7 @@ was neither a string nor a function.</td>
         
 
         <footer>
-            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Thu Dec 19 2024 19:20:35 GMT+0000 (Coordinated Universal Time)
+            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Fri Dec 20 2024 00:14:55 GMT+0000 (Coordinated Universal Time)
         </footer>
     </div>
 </div>
index 883fe7cc14cc7e6925f6c1fdc5ad2e0d5160d4f2..1cf1775b87fe04d8d02745055f02a0cf97d72a41 100644 (file)
@@ -86,6 +86,8 @@
             
                 <li data-name="LuCI#hasViewPermission"><a href="LuCI.html#hasViewPermission">hasViewPermission</a></li>
             
+                <li data-name="LuCI#isArguments"><a href="LuCI.html#isArguments">isArguments</a></li>
+            
                 <li data-name="LuCI#isObject"><a href="LuCI.html#isObject">isObject</a></li>
             
                 <li data-name="LuCI#location"><a href="LuCI.html#location">location</a></li>
@@ -3668,7 +3670,7 @@ distorted form layout when rendering the option element.</p></div>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line4639">line 4639</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line4655">line 4655</a>
         </div>
         
     </div>
@@ -4763,7 +4765,7 @@ table section elements.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line210">line 210</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line212">line 212</a>
         </div>
         
     </div>
@@ -4881,7 +4883,7 @@ table section elements.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1752">line 1752</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1758">line 1758</a>
         </div>
         
     </div>
@@ -5059,7 +5061,7 @@ within the given specific section.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1826">line 1826</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1832">line 1832</a>
         </div>
         
     </div>
@@ -5237,7 +5239,7 @@ different way.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1634">line 1634</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1639">line 1639</a>
         </div>
         
     </div>
@@ -5269,20 +5271,20 @@ constraint evaluation. The associated value of these special &quot;tag&quot; key
 is ignored. The recognized tags are:</p>
 <ul>
   <li>
-   <code>!reverse</code><br>
-   Invert the dependency, instead of requiring another option to be
-   equal to the dependency value, that option should <em>not</em> be
-   equal.
+       <code>!reverse</code><br>
+       Invert the dependency, instead of requiring another option to be
+       equal to the dependency value, that option should <em>not</em> be
+       equal.
   </li>
   <li>
-   <code>!contains</code><br>
-   Instead of requiring an exact match, the dependency is considered
-   satisfied when the dependency value is contained within the option
-   value.
+       <code>!contains</code><br>
+       Instead of requiring an exact match, the dependency is considered
+       satisfied when the dependency value is contained within the option
+       value.
   </li>
   <li>
-   <code>!default</code><br>
-   The dependency is always satisfied
+       <code>!default</code><br>
+       The dependency is always satisfied
   </li>
 </ul>
 <p>Examples:</p>
@@ -5306,7 +5308,7 @@ is ignored. The recognized tags are:</p>
  </li>
  <li>
   <code>opt.depends({ foo: "test" })<br>
-        opt.depends({ bar: "qrx" })</code><br>
+                opt.depends({ bar: "qrx" })</code><br>
   Require either <code>foo</code> to be set to <code>test</code>,
   <em>or</em> the <code>bar</code> option to be <code>qrx</code>.
  </li>
@@ -5458,7 +5460,7 @@ argument, this parameter is ignored.</p></td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1854">line 1854</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1860">line 1860</a>
         </div>
         
     </div>
@@ -5635,7 +5637,7 @@ It may be overwritten by user code to handle input values differently.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1803">line 1803</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1809">line 1809</a>
         </div>
         
     </div>
@@ -5813,7 +5815,7 @@ option implementation does not use <code>LuCI.ui</code> widgets.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1941">line 1941</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1947">line 1947</a>
         </div>
         
     </div>
@@ -5960,7 +5962,7 @@ option implementation does not use <code>LuCI.ui</code> widgets.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1959">line 1959</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1965">line 1965</a>
         </div>
         
     </div>
@@ -6110,7 +6112,7 @@ returns <code>false</code>.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1927">line 1927</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1933">line 1933</a>
         </div>
         
     </div>
@@ -6258,7 +6260,7 @@ returns <code>false</code>.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1780">line 1780</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1786">line 1786</a>
         </div>
         
     </div>
@@ -6441,7 +6443,7 @@ so it may return promises if overridden by user code.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line2000">line 2000</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line2006">line 2006</a>
         </div>
         
     </div>
@@ -6592,7 +6594,7 @@ validation constraints.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line2080">line 2080</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line2086">line 2086</a>
         </div>
         
     </div>
@@ -6717,7 +6719,7 @@ implement alternative removal logic, e.g. to retain the original value.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line288">line 288</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line289">line 289</a>
         </div>
         
     </div>
@@ -6866,7 +6868,7 @@ entities decoded.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1878">line 1878</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1884">line 1884</a>
         </div>
         
     </div>
@@ -7046,7 +7048,7 @@ state of checkbox elements.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line327">line 327</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line328">line 328</a>
         </div>
         
     </div>
@@ -7241,7 +7243,7 @@ was neither a string nor a function.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line3671">line 3671</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line3686">line 3686</a>
         </div>
         
     </div>
@@ -7389,7 +7391,7 @@ or a plain text string. If omitted, the <code>key</code> value is used as captio
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line2057">line 2057</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line2063">line 2063</a>
         </div>
         
     </div>
@@ -7548,7 +7550,7 @@ before it is written.</p>
         
 
         <footer>
-            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Thu Dec 19 2024 19:20:35 GMT+0000 (Coordinated Universal Time)
+            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Fri Dec 20 2024 00:14:55 GMT+0000 (Coordinated Universal Time)
         </footer>
     </div>
 </div>
index 3f061e21b98c413333a02a66c5546585d49705e0..dda8feb1a1d59e4c3c981316e1f631df1a64ae58 100644 (file)
@@ -86,6 +86,8 @@
             
                 <li data-name="LuCI#hasViewPermission"><a href="LuCI.html#hasViewPermission">hasViewPermission</a></li>
             
+                <li data-name="LuCI#isArguments"><a href="LuCI.html#isArguments">isArguments</a></li>
+            
                 <li data-name="LuCI#isObject"><a href="LuCI.html#isObject">isObject</a></li>
             
                 <li data-name="LuCI#location"><a href="LuCI.html#location">location</a></li>
@@ -3664,7 +3666,7 @@ as data source.</p></div>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line778">line 778</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line782">line 782</a>
         </div>
         
     </div>
@@ -3928,7 +3930,7 @@ permissions are granted.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line210">line 210</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line212">line 212</a>
         </div>
         
     </div>
@@ -4046,7 +4048,7 @@ permissions are granted.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line486">line 486</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line487">line 487</a>
         </div>
         
     </div>
@@ -4170,7 +4172,7 @@ config already is in the list of required files, it will be ignored.</p></td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line468">line 468</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line469">line 469</a>
         </div>
         
     </div>
@@ -4395,7 +4397,7 @@ passed.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line425">line 425</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line426">line 426</a>
         </div>
         
     </div>
@@ -4617,7 +4619,7 @@ passed.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line540">line 540</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line541">line 541</a>
         </div>
         
     </div>
@@ -4725,7 +4727,7 @@ an error.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line709">line 709</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line710">line 710</a>
         </div>
         
     </div>
@@ -4944,7 +4946,7 @@ Returns <code>null</code> if the option could not be found.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line570">line 570</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line571">line 571</a>
         </div>
         
     </div>
@@ -5051,7 +5053,7 @@ not meeting the validation constraints of their respective elements.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line641">line 641</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line642">line 642</a>
         </div>
         
     </div>
@@ -5154,7 +5156,7 @@ rendering is complete.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line630">line 630</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line631">line 631</a>
         </div>
         
     </div>
@@ -5258,7 +5260,7 @@ re-rendering is complete.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line600">line 600</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line601">line 601</a>
         </div>
         
     </div>
@@ -5461,7 +5463,7 @@ failed.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line518">line 518</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line519">line 519</a>
         </div>
         
     </div>
@@ -5656,7 +5658,7 @@ documentation for details.</p></td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line288">line 288</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line289">line 289</a>
         </div>
         
     </div>
@@ -5805,7 +5807,7 @@ entities decoded.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line327">line 327</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line328">line 328</a>
         </div>
         
     </div>
@@ -6006,7 +6008,7 @@ was neither a string nor a function.</td>
         
 
         <footer>
-            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Thu Dec 19 2024 19:20:35 GMT+0000 (Coordinated Universal Time)
+            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Fri Dec 20 2024 00:14:55 GMT+0000 (Coordinated Universal Time)
         </footer>
     </div>
 </div>
index 274e521f3c771a599b4987912fc061f279aa18c6..36b8370a0d6dae8e54fe75f8d347558427147932 100644 (file)
@@ -86,6 +86,8 @@
             
                 <li data-name="LuCI#hasViewPermission"><a href="LuCI.html#hasViewPermission">hasViewPermission</a></li>
             
+                <li data-name="LuCI#isArguments"><a href="LuCI.html#isArguments">isArguments</a></li>
+            
                 <li data-name="LuCI#isObject"><a href="LuCI.html#isObject">isObject</a></li>
             
                 <li data-name="LuCI#location"><a href="LuCI.html#location">location</a></li>
@@ -3664,7 +3666,7 @@ It builds upon the <a href="LuCI.ui.Select.html"><code>LuCI.ui.Select</code></a>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line3871">line 3871</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line3886">line 3886</a>
         </div>
         
     </div>
@@ -4908,7 +4910,7 @@ table section elements.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line210">line 210</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line212">line 212</a>
         </div>
         
     </div>
@@ -5026,7 +5028,7 @@ table section elements.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1752">line 1752</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1758">line 1758</a>
         </div>
         
     </div>
@@ -5204,7 +5206,7 @@ within the given specific section.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1826">line 1826</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1832">line 1832</a>
         </div>
         
     </div>
@@ -5382,7 +5384,7 @@ different way.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1634">line 1634</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1639">line 1639</a>
         </div>
         
     </div>
@@ -5414,20 +5416,20 @@ constraint evaluation. The associated value of these special &quot;tag&quot; key
 is ignored. The recognized tags are:</p>
 <ul>
   <li>
-   <code>!reverse</code><br>
-   Invert the dependency, instead of requiring another option to be
-   equal to the dependency value, that option should <em>not</em> be
-   equal.
+       <code>!reverse</code><br>
+       Invert the dependency, instead of requiring another option to be
+       equal to the dependency value, that option should <em>not</em> be
+       equal.
   </li>
   <li>
-   <code>!contains</code><br>
-   Instead of requiring an exact match, the dependency is considered
-   satisfied when the dependency value is contained within the option
-   value.
+       <code>!contains</code><br>
+       Instead of requiring an exact match, the dependency is considered
+       satisfied when the dependency value is contained within the option
+       value.
   </li>
   <li>
-   <code>!default</code><br>
-   The dependency is always satisfied
+       <code>!default</code><br>
+       The dependency is always satisfied
   </li>
 </ul>
 <p>Examples:</p>
@@ -5451,7 +5453,7 @@ is ignored. The recognized tags are:</p>
  </li>
  <li>
   <code>opt.depends({ foo: "test" })<br>
-        opt.depends({ bar: "qrx" })</code><br>
+                opt.depends({ bar: "qrx" })</code><br>
   Require either <code>foo</code> to be set to <code>test</code>,
   <em>or</em> the <code>bar</code> option to be <code>qrx</code>.
  </li>
@@ -5603,7 +5605,7 @@ argument, this parameter is ignored.</p></td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1854">line 1854</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1860">line 1860</a>
         </div>
         
     </div>
@@ -5780,7 +5782,7 @@ It may be overwritten by user code to handle input values differently.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1803">line 1803</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1809">line 1809</a>
         </div>
         
     </div>
@@ -5958,7 +5960,7 @@ option implementation does not use <code>LuCI.ui</code> widgets.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1941">line 1941</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1947">line 1947</a>
         </div>
         
     </div>
@@ -6105,7 +6107,7 @@ option implementation does not use <code>LuCI.ui</code> widgets.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1959">line 1959</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1965">line 1965</a>
         </div>
         
     </div>
@@ -6255,7 +6257,7 @@ returns <code>false</code>.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1927">line 1927</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1933">line 1933</a>
         </div>
         
     </div>
@@ -6403,7 +6405,7 @@ returns <code>false</code>.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1780">line 1780</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1786">line 1786</a>
         </div>
         
     </div>
@@ -6586,7 +6588,7 @@ so it may return promises if overridden by user code.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line2000">line 2000</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line2006">line 2006</a>
         </div>
         
     </div>
@@ -6737,7 +6739,7 @@ validation constraints.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line2080">line 2080</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line2086">line 2086</a>
         </div>
         
     </div>
@@ -6862,7 +6864,7 @@ implement alternative removal logic, e.g. to retain the original value.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line288">line 288</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line289">line 289</a>
         </div>
         
     </div>
@@ -7011,7 +7013,7 @@ entities decoded.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1878">line 1878</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1884">line 1884</a>
         </div>
         
     </div>
@@ -7191,7 +7193,7 @@ state of checkbox elements.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line327">line 327</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line328">line 328</a>
         </div>
         
     </div>
@@ -7384,7 +7386,7 @@ was neither a string nor a function.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line4075">line 4075</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line4090">line 4090</a>
         </div>
         
     </div>
@@ -7560,7 +7562,7 @@ implemented as a simple ListValue entry.</p></td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line2057">line 2057</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line2063">line 2063</a>
         </div>
         
     </div>
@@ -7719,7 +7721,7 @@ before it is written.</p>
         
 
         <footer>
-            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Thu Dec 19 2024 19:20:35 GMT+0000 (Coordinated Universal Time)
+            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Fri Dec 20 2024 00:14:55 GMT+0000 (Coordinated Universal Time)
         </footer>
     </div>
 </div>
index 9db697df01df098135e258e747da64df92b0eca8..dab28cb597fe694c652ab0095300a094ac61f566 100644 (file)
@@ -86,6 +86,8 @@
             
                 <li data-name="LuCI#hasViewPermission"><a href="LuCI.html#hasViewPermission">hasViewPermission</a></li>
             
+                <li data-name="LuCI#isArguments"><a href="LuCI.html#isArguments">isArguments</a></li>
+            
                 <li data-name="LuCI#isObject"><a href="LuCI.html#isObject">isObject</a></li>
             
                 <li data-name="LuCI#location"><a href="LuCI.html#location">location</a></li>
@@ -3665,7 +3667,7 @@ fields each.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line345">line 345</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line346">line 346</a>
         </div>
         
     </div>
@@ -3927,7 +3929,7 @@ permissions are granted.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line210">line 210</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line212">line 212</a>
         </div>
         
     </div>
@@ -4043,7 +4045,7 @@ permissions are granted.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line486">line 486</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line487">line 487</a>
         </div>
         
     </div>
@@ -4165,7 +4167,7 @@ config already is in the list of required files, it will be ignored.</p></td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line468">line 468</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line469">line 469</a>
         </div>
         
     </div>
@@ -4388,7 +4390,7 @@ passed.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line425">line 425</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line426">line 426</a>
         </div>
         
     </div>
@@ -4608,7 +4610,7 @@ passed.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line540">line 540</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line541">line 541</a>
         </div>
         
     </div>
@@ -4714,7 +4716,7 @@ an error.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line709">line 709</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line710">line 710</a>
         </div>
         
     </div>
@@ -4931,7 +4933,7 @@ Returns <code>null</code> if the option could not be found.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line570">line 570</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line571">line 571</a>
         </div>
         
     </div>
@@ -5036,7 +5038,7 @@ not meeting the validation constraints of their respective elements.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line641">line 641</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line642">line 642</a>
         </div>
         
     </div>
@@ -5137,7 +5139,7 @@ rendering is complete.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line630">line 630</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line631">line 631</a>
         </div>
         
     </div>
@@ -5239,7 +5241,7 @@ re-rendering is complete.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line600">line 600</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line601">line 601</a>
         </div>
         
     </div>
@@ -5440,7 +5442,7 @@ failed.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line518">line 518</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line519">line 519</a>
         </div>
         
     </div>
@@ -5635,7 +5637,7 @@ documentation for details.</p></td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line288">line 288</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line289">line 289</a>
         </div>
         
     </div>
@@ -5784,7 +5786,7 @@ entities decoded.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line327">line 327</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line328">line 328</a>
         </div>
         
     </div>
@@ -5985,7 +5987,7 @@ was neither a string nor a function.</td>
         
 
         <footer>
-            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Thu Dec 19 2024 19:20:35 GMT+0000 (Coordinated Universal Time)
+            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Fri Dec 20 2024 00:14:55 GMT+0000 (Coordinated Universal Time)
         </footer>
     </div>
 </div>
index 955df8f2f65a2fa390e2d2fe14dbba3cce5cf23e..43175f00f6158c32987354a0e492a6d30c3ebeed 100644 (file)
@@ -86,6 +86,8 @@
             
                 <li data-name="LuCI#hasViewPermission"><a href="LuCI.html#hasViewPermission">hasViewPermission</a></li>
             
+                <li data-name="LuCI#isArguments"><a href="LuCI.html#isArguments">isArguments</a></li>
+            
                 <li data-name="LuCI#isObject"><a href="LuCI.html#isObject">isObject</a></li>
             
                 <li data-name="LuCI#location"><a href="LuCI.html#location">location</a></li>
@@ -3664,7 +3666,7 @@ select dropdown element.</p></div>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line4248">line 4248</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line4264">line 4264</a>
         </div>
         
     </div>
@@ -4907,7 +4909,7 @@ table section elements.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line210">line 210</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line212">line 212</a>
         </div>
         
     </div>
@@ -5025,7 +5027,7 @@ table section elements.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1752">line 1752</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1758">line 1758</a>
         </div>
         
     </div>
@@ -5203,7 +5205,7 @@ within the given specific section.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1826">line 1826</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1832">line 1832</a>
         </div>
         
     </div>
@@ -5381,7 +5383,7 @@ different way.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1634">line 1634</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1639">line 1639</a>
         </div>
         
     </div>
@@ -5413,20 +5415,20 @@ constraint evaluation. The associated value of these special &quot;tag&quot; key
 is ignored. The recognized tags are:</p>
 <ul>
   <li>
-   <code>!reverse</code><br>
-   Invert the dependency, instead of requiring another option to be
-   equal to the dependency value, that option should <em>not</em> be
-   equal.
+       <code>!reverse</code><br>
+       Invert the dependency, instead of requiring another option to be
+       equal to the dependency value, that option should <em>not</em> be
+       equal.
   </li>
   <li>
-   <code>!contains</code><br>
-   Instead of requiring an exact match, the dependency is considered
-   satisfied when the dependency value is contained within the option
-   value.
+       <code>!contains</code><br>
+       Instead of requiring an exact match, the dependency is considered
+       satisfied when the dependency value is contained within the option
+       value.
   </li>
   <li>
-   <code>!default</code><br>
-   The dependency is always satisfied
+       <code>!default</code><br>
+       The dependency is always satisfied
   </li>
 </ul>
 <p>Examples:</p>
@@ -5450,7 +5452,7 @@ is ignored. The recognized tags are:</p>
  </li>
  <li>
   <code>opt.depends({ foo: "test" })<br>
-        opt.depends({ bar: "qrx" })</code><br>
+                opt.depends({ bar: "qrx" })</code><br>
   Require either <code>foo</code> to be set to <code>test</code>,
   <em>or</em> the <code>bar</code> option to be <code>qrx</code>.
  </li>
@@ -5602,7 +5604,7 @@ argument, this parameter is ignored.</p></td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1854">line 1854</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1860">line 1860</a>
         </div>
         
     </div>
@@ -5779,7 +5781,7 @@ It may be overwritten by user code to handle input values differently.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1803">line 1803</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1809">line 1809</a>
         </div>
         
     </div>
@@ -5957,7 +5959,7 @@ option implementation does not use <code>LuCI.ui</code> widgets.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1941">line 1941</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1947">line 1947</a>
         </div>
         
     </div>
@@ -6104,7 +6106,7 @@ option implementation does not use <code>LuCI.ui</code> widgets.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1959">line 1959</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1965">line 1965</a>
         </div>
         
     </div>
@@ -6254,7 +6256,7 @@ returns <code>false</code>.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1927">line 1927</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1933">line 1933</a>
         </div>
         
     </div>
@@ -6402,7 +6404,7 @@ returns <code>false</code>.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1780">line 1780</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1786">line 1786</a>
         </div>
         
     </div>
@@ -6585,7 +6587,7 @@ so it may return promises if overridden by user code.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line2000">line 2000</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line2006">line 2006</a>
         </div>
         
     </div>
@@ -6736,7 +6738,7 @@ validation constraints.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line2080">line 2080</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line2086">line 2086</a>
         </div>
         
     </div>
@@ -6861,7 +6863,7 @@ implement alternative removal logic, e.g. to retain the original value.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line288">line 288</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line289">line 289</a>
         </div>
         
     </div>
@@ -7010,7 +7012,7 @@ entities decoded.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1878">line 1878</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1884">line 1884</a>
         </div>
         
     </div>
@@ -7190,7 +7192,7 @@ state of checkbox elements.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line327">line 327</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line328">line 328</a>
         </div>
         
     </div>
@@ -7385,7 +7387,7 @@ was neither a string nor a function.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line3671">line 3671</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line3686">line 3686</a>
         </div>
         
     </div>
@@ -7533,7 +7535,7 @@ or a plain text string. If omitted, the <code>key</code> value is used as captio
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line2057">line 2057</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line2063">line 2063</a>
         </div>
         
     </div>
@@ -7692,7 +7694,7 @@ before it is written.</p>
         
 
         <footer>
-            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Thu Dec 19 2024 19:20:35 GMT+0000 (Coordinated Universal Time)
+            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Fri Dec 20 2024 00:14:55 GMT+0000 (Coordinated Universal Time)
         </footer>
     </div>
 </div>
index 67e86e29de4e3ec18dc6c4992fafe909eecc8bf5..9d834f951df325810f930e3a0e356ec870d8c60f 100644 (file)
@@ -86,6 +86,8 @@
             
                 <li data-name="LuCI#hasViewPermission"><a href="LuCI.html#hasViewPermission">hasViewPermission</a></li>
             
+                <li data-name="LuCI#isArguments"><a href="LuCI.html#isArguments">isArguments</a></li>
+            
                 <li data-name="LuCI#isObject"><a href="LuCI.html#isObject">isObject</a></li>
             
                 <li data-name="LuCI#location"><a href="LuCI.html#location">location</a></li>
@@ -3665,7 +3667,7 @@ specified when constructing the class instance.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line3456">line 3456</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line3469">line 3469</a>
         </div>
         
     </div>
@@ -4081,7 +4083,7 @@ this property will hold a reference to the parent option instance.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line210">line 210</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line212">line 212</a>
         </div>
         
     </div>
@@ -4197,7 +4199,7 @@ this property will hold a reference to the parent option instance.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line3522">line 3522</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line3535">line 3535</a>
         </div>
         
     </div>
@@ -4301,7 +4303,7 @@ section ID as sole element. User code should not normally change this.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1085">line 1085</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1090">line 1090</a>
         </div>
         
     </div>
@@ -4499,7 +4501,7 @@ on the amount of passed arguments.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line889">line 889</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line893">line 893</a>
         </div>
         
     </div>
@@ -4653,7 +4655,7 @@ custom implementations.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1118">line 1118</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1123">line 1123</a>
         </div>
         
     </div>
@@ -4851,7 +4853,7 @@ on the amount of passed arguments.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1184">line 1184</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1189">line 1189</a>
         </div>
         
     </div>
@@ -5018,7 +5020,7 @@ depending on the amount of passed arguments.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1154">line 1154</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1159">line 1159</a>
         </div>
         
     </div>
@@ -5213,7 +5215,7 @@ on the amount of passed arguments.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line904">line 904</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line908">line 908</a>
         </div>
         
     </div>
@@ -5319,7 +5321,7 @@ elements load functions rejected with an error.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1017">line 1017</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1021">line 1021</a>
         </div>
         
     </div>
@@ -5536,7 +5538,7 @@ descendant of <code>AbstractValue</code>.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line933">line 933</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line937">line 937</a>
         </div>
         
     </div>
@@ -5644,7 +5646,7 @@ not meeting the validation constraints of their respective elements.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line3595">line 3595</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line3610">line 3610</a>
         </div>
         
     </div>
@@ -5752,7 +5754,7 @@ the form element's markup, including the markup of any child elements.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line288">line 288</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line289">line 289</a>
         </div>
         
     </div>
@@ -5901,7 +5903,7 @@ entities decoded.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line974">line 974</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line978">line 978</a>
         </div>
         
     </div>
@@ -6120,7 +6122,7 @@ contents. If omitted, no description will be rendered.</p></td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1054">line 1054</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1058">line 1058</a>
         </div>
         
     </div>
@@ -6389,7 +6391,7 @@ descendant of <code>AbstractValue</code>.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line327">line 327</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line328">line 328</a>
         </div>
         
     </div>
@@ -6590,7 +6592,7 @@ was neither a string nor a function.</td>
         
 
         <footer>
-            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Thu Dec 19 2024 19:20:35 GMT+0000 (Coordinated Universal Time)
+            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Fri Dec 20 2024 00:14:55 GMT+0000 (Coordinated Universal Time)
         </footer>
     </div>
 </div>
index d7b6fe576b0f66bcb47f2f2fa72a21e3f3ffcb09..21c24534361e16fa83addf33ae53cdebe343b76e 100644 (file)
@@ -86,6 +86,8 @@
             
                 <li data-name="LuCI#hasViewPermission"><a href="LuCI.html#hasViewPermission">hasViewPermission</a></li>
             
+                <li data-name="LuCI#isArguments"><a href="LuCI.html#isArguments">isArguments</a></li>
+            
                 <li data-name="LuCI#isObject"><a href="LuCI.html#isObject">isObject</a></li>
             
                 <li data-name="LuCI#location"><a href="LuCI.html#location">location</a></li>
@@ -3665,7 +3667,7 @@ It builds upon the <a href="LuCI.form.ListValue.html"><code>LuCI.form.ListValue<
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line3963">line 3963</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line3978">line 3978</a>
         </div>
         
     </div>
@@ -5058,7 +5060,7 @@ table section elements.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line210">line 210</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line212">line 212</a>
         </div>
         
     </div>
@@ -5176,7 +5178,7 @@ table section elements.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1752">line 1752</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1758">line 1758</a>
         </div>
         
     </div>
@@ -5354,7 +5356,7 @@ within the given specific section.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1826">line 1826</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1832">line 1832</a>
         </div>
         
     </div>
@@ -5532,7 +5534,7 @@ different way.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1634">line 1634</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1639">line 1639</a>
         </div>
         
     </div>
@@ -5564,20 +5566,20 @@ constraint evaluation. The associated value of these special &quot;tag&quot; key
 is ignored. The recognized tags are:</p>
 <ul>
   <li>
-   <code>!reverse</code><br>
-   Invert the dependency, instead of requiring another option to be
-   equal to the dependency value, that option should <em>not</em> be
-   equal.
+       <code>!reverse</code><br>
+       Invert the dependency, instead of requiring another option to be
+       equal to the dependency value, that option should <em>not</em> be
+       equal.
   </li>
   <li>
-   <code>!contains</code><br>
-   Instead of requiring an exact match, the dependency is considered
-   satisfied when the dependency value is contained within the option
-   value.
+       <code>!contains</code><br>
+       Instead of requiring an exact match, the dependency is considered
+       satisfied when the dependency value is contained within the option
+       value.
   </li>
   <li>
-   <code>!default</code><br>
-   The dependency is always satisfied
+       <code>!default</code><br>
+       The dependency is always satisfied
   </li>
 </ul>
 <p>Examples:</p>
@@ -5601,7 +5603,7 @@ is ignored. The recognized tags are:</p>
  </li>
  <li>
   <code>opt.depends({ foo: "test" })<br>
-        opt.depends({ bar: "qrx" })</code><br>
+                opt.depends({ bar: "qrx" })</code><br>
   Require either <code>foo</code> to be set to <code>test</code>,
   <em>or</em> the <code>bar</code> option to be <code>qrx</code>.
  </li>
@@ -5753,7 +5755,7 @@ argument, this parameter is ignored.</p></td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1854">line 1854</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1860">line 1860</a>
         </div>
         
     </div>
@@ -5930,7 +5932,7 @@ It may be overwritten by user code to handle input values differently.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1803">line 1803</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1809">line 1809</a>
         </div>
         
     </div>
@@ -6108,7 +6110,7 @@ option implementation does not use <code>LuCI.ui</code> widgets.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1941">line 1941</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1947">line 1947</a>
         </div>
         
     </div>
@@ -6255,7 +6257,7 @@ option implementation does not use <code>LuCI.ui</code> widgets.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1959">line 1959</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1965">line 1965</a>
         </div>
         
     </div>
@@ -6405,7 +6407,7 @@ returns <code>false</code>.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1927">line 1927</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1933">line 1933</a>
         </div>
         
     </div>
@@ -6553,7 +6555,7 @@ returns <code>false</code>.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1780">line 1780</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1786">line 1786</a>
         </div>
         
     </div>
@@ -6736,7 +6738,7 @@ so it may return promises if overridden by user code.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line2000">line 2000</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line2006">line 2006</a>
         </div>
         
     </div>
@@ -6887,7 +6889,7 @@ validation constraints.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line2080">line 2080</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line2086">line 2086</a>
         </div>
         
     </div>
@@ -7012,7 +7014,7 @@ implement alternative removal logic, e.g. to retain the original value.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line288">line 288</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line289">line 289</a>
         </div>
         
     </div>
@@ -7161,7 +7163,7 @@ entities decoded.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1878">line 1878</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1884">line 1884</a>
         </div>
         
     </div>
@@ -7341,7 +7343,7 @@ state of checkbox elements.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line327">line 327</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line328">line 328</a>
         </div>
         
     </div>
@@ -7536,7 +7538,7 @@ was neither a string nor a function.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line4075">line 4075</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line4090">line 4090</a>
         </div>
         
     </div>
@@ -7712,7 +7714,7 @@ implemented as a simple ListValue entry.</p></td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line2057">line 2057</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line2063">line 2063</a>
         </div>
         
     </div>
@@ -7871,7 +7873,7 @@ before it is written.</p>
         
 
         <footer>
-            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Thu Dec 19 2024 19:20:35 GMT+0000 (Coordinated Universal Time)
+            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Fri Dec 20 2024 00:14:55 GMT+0000 (Coordinated Universal Time)
         </footer>
     </div>
 </div>
index f9ab5ae3dc9c7edaa8680bd0d3e2241d330a8aeb..5eb0e8ffd032547ef751576d5588a11449dcc494 100644 (file)
@@ -86,6 +86,8 @@
             
                 <li data-name="LuCI#hasViewPermission"><a href="LuCI.html#hasViewPermission">hasViewPermission</a></li>
             
+                <li data-name="LuCI#isArguments"><a href="LuCI.html#isArguments">isArguments</a></li>
+            
                 <li data-name="LuCI#isObject"><a href="LuCI.html#isObject">isObject</a></li>
             
                 <li data-name="LuCI#location"><a href="LuCI.html#location">location</a></li>
@@ -3663,7 +3665,7 @@ element container, allowing to nest form sections into other sections.</p></div>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line4830">line 4830</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line4846">line 4846</a>
         </div>
         
     </div>
@@ -4811,7 +4813,7 @@ table section elements.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line210">line 210</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line212">line 212</a>
         </div>
         
     </div>
@@ -4929,7 +4931,7 @@ table section elements.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1752">line 1752</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1758">line 1758</a>
         </div>
         
     </div>
@@ -5107,7 +5109,7 @@ within the given specific section.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line4942">line 4942</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line4958">line 4958</a>
         </div>
         
     </div>
@@ -5282,7 +5284,7 @@ its <code>cfgvalue()</code> implementation will always return <code>null</code>.
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1634">line 1634</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1639">line 1639</a>
         </div>
         
     </div>
@@ -5314,20 +5316,20 @@ constraint evaluation. The associated value of these special &quot;tag&quot; key
 is ignored. The recognized tags are:</p>
 <ul>
   <li>
-   <code>!reverse</code><br>
-   Invert the dependency, instead of requiring another option to be
-   equal to the dependency value, that option should <em>not</em> be
-   equal.
+       <code>!reverse</code><br>
+       Invert the dependency, instead of requiring another option to be
+       equal to the dependency value, that option should <em>not</em> be
+       equal.
   </li>
   <li>
-   <code>!contains</code><br>
-   Instead of requiring an exact match, the dependency is considered
-   satisfied when the dependency value is contained within the option
-   value.
+       <code>!contains</code><br>
+       Instead of requiring an exact match, the dependency is considered
+       satisfied when the dependency value is contained within the option
+       value.
   </li>
   <li>
-   <code>!default</code><br>
-   The dependency is always satisfied
+       <code>!default</code><br>
+       The dependency is always satisfied
   </li>
 </ul>
 <p>Examples:</p>
@@ -5351,7 +5353,7 @@ is ignored. The recognized tags are:</p>
  </li>
  <li>
   <code>opt.depends({ foo: "test" })<br>
-        opt.depends({ bar: "qrx" })</code><br>
+                opt.depends({ bar: "qrx" })</code><br>
   Require either <code>foo</code> to be set to <code>test</code>,
   <em>or</em> the <code>bar</code> option to be <code>qrx</code>.
  </li>
@@ -5503,7 +5505,7 @@ argument, this parameter is ignored.</p></td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line4951">line 4951</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line4967">line 4967</a>
         </div>
         
     </div>
@@ -5678,7 +5680,7 @@ its <code>formvalue()</code> implementation will always return <code>null</code>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1803">line 1803</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1809">line 1809</a>
         </div>
         
     </div>
@@ -5856,7 +5858,7 @@ option implementation does not use <code>LuCI.ui</code> widgets.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1941">line 1941</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1947">line 1947</a>
         </div>
         
     </div>
@@ -6003,7 +6005,7 @@ option implementation does not use <code>LuCI.ui</code> widgets.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1959">line 1959</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1965">line 1965</a>
         </div>
         
     </div>
@@ -6153,7 +6155,7 @@ returns <code>false</code>.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1927">line 1927</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1933">line 1933</a>
         </div>
         
     </div>
@@ -6301,7 +6303,7 @@ returns <code>false</code>.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line4891">line 4891</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line4907">line 4907</a>
         </div>
         
     </div>
@@ -6484,7 +6486,7 @@ so it may return promises if overridden by user code.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line4896">line 4896</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line4912">line 4912</a>
         </div>
         
     </div>
@@ -6635,7 +6637,7 @@ validation constraints.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line4933">line 4933</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line4949">line 4949</a>
         </div>
         
     </div>
@@ -6754,7 +6756,7 @@ its <code>remove()</code> implementation is a no-op.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line288">line 288</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line289">line 289</a>
         </div>
         
     </div>
@@ -6903,7 +6905,7 @@ entities decoded.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1878">line 1878</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1884">line 1884</a>
         </div>
         
     </div>
@@ -7083,7 +7085,7 @@ state of checkbox elements.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line327">line 327</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line328">line 328</a>
         </div>
         
     </div>
@@ -7278,7 +7280,7 @@ was neither a string nor a function.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line4917">line 4917</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line4933">line 4933</a>
         </div>
         
     </div>
@@ -7424,7 +7426,7 @@ or a plain text string. If omitted, the <code>key</code> value is used as captio
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line4925">line 4925</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line4941">line 4941</a>
         </div>
         
     </div>
@@ -7575,7 +7577,7 @@ its <code>write()</code> implementation is a no-op.</p>
         
 
         <footer>
-            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Thu Dec 19 2024 19:20:35 GMT+0000 (Coordinated Universal Time)
+            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Fri Dec 20 2024 00:14:55 GMT+0000 (Coordinated Universal Time)
         </footer>
     </div>
 </div>
index 0ddd85d3df5c05a36bda56f9ae848c5cadb824eb..c5d6d4ace016a9b2b95826908f9e8308e43516db 100644 (file)
@@ -86,6 +86,8 @@
             
                 <li data-name="LuCI#hasViewPermission"><a href="LuCI.html#hasViewPermission">hasViewPermission</a></li>
             
+                <li data-name="LuCI#isArguments"><a href="LuCI.html#isArguments">isArguments</a></li>
+            
                 <li data-name="LuCI#isObject"><a href="LuCI.html#isObject">isObject</a></li>
             
                 <li data-name="LuCI#location"><a href="LuCI.html#location">location</a></li>
@@ -3668,7 +3670,7 @@ value of the <code>addremove</code> property.</p></div>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line2348">line 2348</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line2355">line 2355</a>
         </div>
         
     </div>
@@ -4627,7 +4629,7 @@ The default is <code>null</code>, means inheriting from the parent form.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line3131">line 3131</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line3143">line 3143</a>
         </div>
         
     </div>
@@ -4830,7 +4832,7 @@ is shown.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line210">line 210</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line212">line 212</a>
         </div>
         
     </div>
@@ -4948,7 +4950,7 @@ is shown.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1085">line 1085</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1090">line 1090</a>
         </div>
         
     </div>
@@ -5146,7 +5148,7 @@ on the amount of passed arguments.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line889">line 889</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line893">line 893</a>
         </div>
         
     </div>
@@ -5300,7 +5302,7 @@ custom implementations.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1118">line 1118</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1123">line 1123</a>
         </div>
         
     </div>
@@ -5498,7 +5500,7 @@ on the amount of passed arguments.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1184">line 1184</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1189">line 1189</a>
         </div>
         
     </div>
@@ -5665,7 +5667,7 @@ depending on the amount of passed arguments.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1154">line 1154</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1159">line 1159</a>
         </div>
         
     </div>
@@ -5860,7 +5862,7 @@ on the amount of passed arguments.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line904">line 904</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line908">line 908</a>
         </div>
         
     </div>
@@ -5966,7 +5968,7 @@ elements load functions rejected with an error.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1017">line 1017</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1021">line 1021</a>
         </div>
         
     </div>
@@ -6183,7 +6185,7 @@ descendant of <code>AbstractValue</code>.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line933">line 933</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line937">line 937</a>
         </div>
         
     </div>
@@ -6291,7 +6293,7 @@ not meeting the validation constraints of their respective elements.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line288">line 288</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line289">line 289</a>
         </div>
         
     </div>
@@ -6440,7 +6442,7 @@ entities decoded.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line2488">line 2488</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line2495">line 2495</a>
         </div>
         
     </div>
@@ -6638,7 +6640,7 @@ contents. If omitted, no description will be rendered.</p></td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1054">line 1054</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1058">line 1058</a>
         </div>
         
     </div>
@@ -6907,7 +6909,7 @@ descendant of <code>AbstractValue</code>.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line327">line 327</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line328">line 328</a>
         </div>
         
     </div>
@@ -7108,7 +7110,7 @@ was neither a string nor a function.</td>
         
 
         <footer>
-            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Thu Dec 19 2024 19:20:35 GMT+0000 (Coordinated Universal Time)
+            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Fri Dec 20 2024 00:14:55 GMT+0000 (Coordinated Universal Time)
         </footer>
     </div>
 </div>
index 0536cbc3b27279d344f1578c523ec3c7c819991f..e983963d5b7e1274d59f68d107a02d4ddaf14754 100644 (file)
@@ -86,6 +86,8 @@
             
                 <li data-name="LuCI#hasViewPermission"><a href="LuCI.html#hasViewPermission">hasViewPermission</a></li>
             
+                <li data-name="LuCI#isArguments"><a href="LuCI.html#isArguments">isArguments</a></li>
+            
                 <li data-name="LuCI#isObject"><a href="LuCI.html#isObject">isObject</a></li>
             
                 <li data-name="LuCI#location"><a href="LuCI.html#location">location</a></li>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line4338">line 4338</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line4354">line 4354</a>
         </div>
         
     </div>
@@ -4954,7 +4956,7 @@ table section elements.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line210">line 210</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line212">line 212</a>
         </div>
         
     </div>
@@ -5072,7 +5074,7 @@ table section elements.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1752">line 1752</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1758">line 1758</a>
         </div>
         
     </div>
@@ -5250,7 +5252,7 @@ within the given specific section.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1826">line 1826</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1832">line 1832</a>
         </div>
         
     </div>
@@ -5428,7 +5430,7 @@ different way.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1634">line 1634</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1639">line 1639</a>
         </div>
         
     </div>
@@ -5460,20 +5462,20 @@ constraint evaluation. The associated value of these special &quot;tag&quot; key
 is ignored. The recognized tags are:</p>
 <ul>
   <li>
-   <code>!reverse</code><br>
-   Invert the dependency, instead of requiring another option to be
-   equal to the dependency value, that option should <em>not</em> be
-   equal.
+       <code>!reverse</code><br>
+       Invert the dependency, instead of requiring another option to be
+       equal to the dependency value, that option should <em>not</em> be
+       equal.
   </li>
   <li>
-   <code>!contains</code><br>
-   Instead of requiring an exact match, the dependency is considered
-   satisfied when the dependency value is contained within the option
-   value.
+       <code>!contains</code><br>
+       Instead of requiring an exact match, the dependency is considered
+       satisfied when the dependency value is contained within the option
+       value.
   </li>
   <li>
-   <code>!default</code><br>
-   The dependency is always satisfied
+       <code>!default</code><br>
+       The dependency is always satisfied
   </li>
 </ul>
 <p>Examples:</p>
@@ -5497,7 +5499,7 @@ is ignored. The recognized tags are:</p>
  </li>
  <li>
   <code>opt.depends({ foo: "test" })<br>
-        opt.depends({ bar: "qrx" })</code><br>
+                opt.depends({ bar: "qrx" })</code><br>
   Require either <code>foo</code> to be set to <code>test</code>,
   <em>or</em> the <code>bar</code> option to be <code>qrx</code>.
  </li>
@@ -5649,7 +5651,7 @@ argument, this parameter is ignored.</p></td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1854">line 1854</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1860">line 1860</a>
         </div>
         
     </div>
@@ -5826,7 +5828,7 @@ It may be overwritten by user code to handle input values differently.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1803">line 1803</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1809">line 1809</a>
         </div>
         
     </div>
@@ -6004,7 +6006,7 @@ option implementation does not use <code>LuCI.ui</code> widgets.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1941">line 1941</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1947">line 1947</a>
         </div>
         
     </div>
@@ -6151,7 +6153,7 @@ option implementation does not use <code>LuCI.ui</code> widgets.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1959">line 1959</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1965">line 1965</a>
         </div>
         
     </div>
@@ -6301,7 +6303,7 @@ returns <code>false</code>.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1927">line 1927</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1933">line 1933</a>
         </div>
         
     </div>
@@ -6449,7 +6451,7 @@ returns <code>false</code>.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1780">line 1780</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1786">line 1786</a>
         </div>
         
     </div>
@@ -6632,7 +6634,7 @@ so it may return promises if overridden by user code.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line2000">line 2000</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line2006">line 2006</a>
         </div>
         
     </div>
@@ -6783,7 +6785,7 @@ validation constraints.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line2080">line 2080</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line2086">line 2086</a>
         </div>
         
     </div>
@@ -6908,7 +6910,7 @@ implement alternative removal logic, e.g. to retain the original value.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line288">line 288</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line289">line 289</a>
         </div>
         
     </div>
@@ -7057,7 +7059,7 @@ entities decoded.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1878">line 1878</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1884">line 1884</a>
         </div>
         
     </div>
@@ -7237,7 +7239,7 @@ state of checkbox elements.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line327">line 327</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line328">line 328</a>
         </div>
         
     </div>
@@ -7432,7 +7434,7 @@ was neither a string nor a function.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line2057">line 2057</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line2063">line 2063</a>
         </div>
         
     </div>
@@ -7591,7 +7593,7 @@ before it is written.</p>
         
 
         <footer>
-            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Thu Dec 19 2024 19:20:35 GMT+0000 (Coordinated Universal Time)
+            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Fri Dec 20 2024 00:14:55 GMT+0000 (Coordinated Universal Time)
         </footer>
     </div>
 </div>
index 70dceffae4247fcb5c54d876e4cea19f871a3237..2598fe766a6e501ec80dfc3420a6e898487266b2 100644 (file)
@@ -86,6 +86,8 @@
             
                 <li data-name="LuCI#hasViewPermission"><a href="LuCI.html#hasViewPermission">hasViewPermission</a></li>
             
+                <li data-name="LuCI#isArguments"><a href="LuCI.html#isArguments">isArguments</a></li>
+            
                 <li data-name="LuCI#isObject"><a href="LuCI.html#isObject">isObject</a></li>
             
                 <li data-name="LuCI#location"><a href="LuCI.html#location">location</a></li>
@@ -3668,7 +3670,7 @@ value of the <code>addremove</code> property.</p></div>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line2110">line 2110</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line2116">line 2116</a>
         </div>
         
     </div>
@@ -4260,7 +4262,7 @@ this property will hold a reference to the parent option instance.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line210">line 210</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line212">line 212</a>
         </div>
         
     </div>
@@ -4378,7 +4380,7 @@ this property will hold a reference to the parent option instance.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line2198">line 2198</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line2204">line 2204</a>
         </div>
         
     </div>
@@ -4508,7 +4510,7 @@ The sections will be rendered in the same order as the returned array.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1085">line 1085</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1090">line 1090</a>
         </div>
         
     </div>
@@ -4706,7 +4708,7 @@ on the amount of passed arguments.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line889">line 889</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line893">line 893</a>
         </div>
         
     </div>
@@ -4860,7 +4862,7 @@ custom implementations.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1118">line 1118</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1123">line 1123</a>
         </div>
         
     </div>
@@ -5058,7 +5060,7 @@ on the amount of passed arguments.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1184">line 1184</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1189">line 1189</a>
         </div>
         
     </div>
@@ -5225,7 +5227,7 @@ depending on the amount of passed arguments.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1154">line 1154</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1159">line 1159</a>
         </div>
         
     </div>
@@ -5420,7 +5422,7 @@ on the amount of passed arguments.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line904">line 904</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line908">line 908</a>
         </div>
         
     </div>
@@ -5526,7 +5528,7 @@ elements load functions rejected with an error.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1017">line 1017</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1021">line 1021</a>
         </div>
         
     </div>
@@ -5743,7 +5745,7 @@ descendant of <code>AbstractValue</code>.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line933">line 933</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line937">line 937</a>
         </div>
         
     </div>
@@ -5851,7 +5853,7 @@ not meeting the validation constraints of their respective elements.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line2337">line 2337</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line2344">line 2344</a>
         </div>
         
     </div>
@@ -5959,7 +5961,7 @@ the form element's markup, including the markup of any child elements.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line288">line 288</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line289">line 289</a>
         </div>
         
     </div>
@@ -6108,7 +6110,7 @@ entities decoded.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line974">line 974</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line978">line 978</a>
         </div>
         
     </div>
@@ -6327,7 +6329,7 @@ contents. If omitted, no description will be rendered.</p></td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1054">line 1054</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1058">line 1058</a>
         </div>
         
     </div>
@@ -6596,7 +6598,7 @@ descendant of <code>AbstractValue</code>.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line327">line 327</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line328">line 328</a>
         </div>
         
     </div>
@@ -6797,7 +6799,7 @@ was neither a string nor a function.</td>
         
 
         <footer>
-            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Thu Dec 19 2024 19:20:36 GMT+0000 (Coordinated Universal Time)
+            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Fri Dec 20 2024 00:14:55 GMT+0000 (Coordinated Universal Time)
         </footer>
     </div>
 </div>
index e8d59647b7b7767edd7916852000d304a2b1dee4..dd5fbad531668c4f69110cc79b125b8e2d5f1e6f 100644 (file)
@@ -86,6 +86,8 @@
             
                 <li data-name="LuCI#hasViewPermission"><a href="LuCI.html#hasViewPermission">hasViewPermission</a></li>
             
+                <li data-name="LuCI#isArguments"><a href="LuCI.html#isArguments">isArguments</a></li>
+            
                 <li data-name="LuCI#isObject"><a href="LuCI.html#isObject">isObject</a></li>
             
                 <li data-name="LuCI#location"><a href="LuCI.html#location">location</a></li>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line3606">line 3606</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line3621">line 3621</a>
         </div>
         
     </div>
@@ -4759,7 +4761,7 @@ table section elements.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line210">line 210</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line212">line 212</a>
         </div>
         
     </div>
@@ -4877,7 +4879,7 @@ table section elements.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1752">line 1752</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1758">line 1758</a>
         </div>
         
     </div>
@@ -5055,7 +5057,7 @@ within the given specific section.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1826">line 1826</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1832">line 1832</a>
         </div>
         
     </div>
@@ -5233,7 +5235,7 @@ different way.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1634">line 1634</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1639">line 1639</a>
         </div>
         
     </div>
@@ -5265,20 +5267,20 @@ constraint evaluation. The associated value of these special &quot;tag&quot; key
 is ignored. The recognized tags are:</p>
 <ul>
   <li>
-   <code>!reverse</code><br>
-   Invert the dependency, instead of requiring another option to be
-   equal to the dependency value, that option should <em>not</em> be
-   equal.
+       <code>!reverse</code><br>
+       Invert the dependency, instead of requiring another option to be
+       equal to the dependency value, that option should <em>not</em> be
+       equal.
   </li>
   <li>
-   <code>!contains</code><br>
-   Instead of requiring an exact match, the dependency is considered
-   satisfied when the dependency value is contained within the option
-   value.
+       <code>!contains</code><br>
+       Instead of requiring an exact match, the dependency is considered
+       satisfied when the dependency value is contained within the option
+       value.
   </li>
   <li>
-   <code>!default</code><br>
-   The dependency is always satisfied
+       <code>!default</code><br>
+       The dependency is always satisfied
   </li>
 </ul>
 <p>Examples:</p>
@@ -5302,7 +5304,7 @@ is ignored. The recognized tags are:</p>
  </li>
  <li>
   <code>opt.depends({ foo: "test" })<br>
-        opt.depends({ bar: "qrx" })</code><br>
+                opt.depends({ bar: "qrx" })</code><br>
   Require either <code>foo</code> to be set to <code>test</code>,
   <em>or</em> the <code>bar</code> option to be <code>qrx</code>.
  </li>
@@ -5454,7 +5456,7 @@ argument, this parameter is ignored.</p></td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1854">line 1854</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1860">line 1860</a>
         </div>
         
     </div>
@@ -5631,7 +5633,7 @@ It may be overwritten by user code to handle input values differently.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1803">line 1803</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1809">line 1809</a>
         </div>
         
     </div>
@@ -5809,7 +5811,7 @@ option implementation does not use <code>LuCI.ui</code> widgets.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1941">line 1941</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1947">line 1947</a>
         </div>
         
     </div>
@@ -5956,7 +5958,7 @@ option implementation does not use <code>LuCI.ui</code> widgets.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1959">line 1959</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1965">line 1965</a>
         </div>
         
     </div>
@@ -6106,7 +6108,7 @@ returns <code>false</code>.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1927">line 1927</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1933">line 1933</a>
         </div>
         
     </div>
@@ -6254,7 +6256,7 @@ returns <code>false</code>.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1780">line 1780</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1786">line 1786</a>
         </div>
         
     </div>
@@ -6437,7 +6439,7 @@ so it may return promises if overridden by user code.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line2000">line 2000</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line2006">line 2006</a>
         </div>
         
     </div>
@@ -6588,7 +6590,7 @@ validation constraints.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line2080">line 2080</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line2086">line 2086</a>
         </div>
         
     </div>
@@ -6713,7 +6715,7 @@ implement alternative removal logic, e.g. to retain the original value.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line3680">line 3680</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line3695">line 3695</a>
         </div>
         
     </div>
@@ -6821,7 +6823,7 @@ the form element's markup, including the markup of any child elements.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line288">line 288</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line289">line 289</a>
         </div>
         
     </div>
@@ -6970,7 +6972,7 @@ entities decoded.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1878">line 1878</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line1884">line 1884</a>
         </div>
         
     </div>
@@ -7150,7 +7152,7 @@ state of checkbox elements.</p>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line327">line 327</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line328">line 328</a>
         </div>
         
     </div>
@@ -7343,7 +7345,7 @@ was neither a string nor a function.</td>
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line3671">line 3671</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line3686">line 3686</a>
         </div>
         
     </div>
@@ -7491,7 +7493,7 @@ or a plain text string. If omitted, the <code>key</code> value is used as captio
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line2057">line 2057</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line2063">line 2063</a>
         </div>
         
     </div>
@@ -7650,7 +7652,7 @@ before it is written.</p>
         
 
         <footer>
-            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Thu Dec 19 2024 19:20:36 GMT+0000 (Coordinated Universal Time)
+            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Fri Dec 20 2024 00:14:55 GMT+0000 (Coordinated Universal Time)
         </footer>
     </div>
 </div>
index aa886c06799c443a131a8573a380dc99b1a1df20..629411aa651584fc485e948988dd02d64bfa7005 100644 (file)
@@ -86,6 +86,8 @@
             
                 <li data-name="LuCI#hasViewPermission"><a href="LuCI.html#hasViewPermission">hasViewPermission</a></li>
             
+                <li data-name="LuCI#isArguments"><a href="LuCI.html#isArguments">isArguments</a></li>
+            
                 <li data-name="LuCI#isObject"><a href="LuCI.html#isObject">isObject</a></li>
             
                 <li data-name="LuCI#location"><a href="LuCI.html#location">location</a></li>
@@ -3657,7 +3659,7 @@ assemble the HTML markup and insert it into the DOM.</p>
 'use strict';
 'require form';
 
-var m, s, o;
+let m, s, o;
 
 m = new form.Map('example', 'Example form',
        'This is an example form mapping the contents of /etc/config/example');
@@ -3671,7 +3673,7 @@ o = s.option(form.ListValue, 'some_choice', 'A select element');
 o.value('choice1', 'The first choice');
 o.value('choice2', 'The second choice');
 
-m.render().then(function(node) {
+m.render().then((node) => {
        document.body.appendChild(node);
 });
 </pre></div>
@@ -3693,7 +3695,7 @@ m.render().then(function(node) {
     
         
         <div class="tag-source">
-            <a href="form.js.html">form.js</a>, <a href="form.js.html#line4954">line 4954</a>
+            <a href="form.js.html">form.js</a>, <a href="form.js.html#line4970">line 4970</a>
         </div>
         
     </div>
@@ -3849,7 +3851,7 @@ m.render().then(function(node) {
         
 
         <footer>
-            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Thu Dec 19 2024 19:20:35 GMT+0000 (Coordinated Universal Time)
+            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Fri Dec 20 2024 00:14:55 GMT+0000 (Coordinated Universal Time)
         </footer>
     </div>
 </div>
index 0ec596ce78769fc5b5aae7d5308199e4d7d7ec67..2dce51f026d06780b2ef9ebe02ad5fd40d58a370 100644 (file)
@@ -86,6 +86,8 @@
             
                 <li data-name="LuCI#hasViewPermission"><a href="LuCI.html#hasViewPermission">hasViewPermission</a></li>
             
+                <li data-name="LuCI#isArguments"><a href="LuCI.html#isArguments">isArguments</a></li>
+            
                 <li data-name="LuCI#isObject"><a href="LuCI.html#isObject">isObject</a></li>
             
                 <li data-name="LuCI#location"><a href="LuCI.html#location">location</a></li>
@@ -6035,7 +6037,7 @@ the failure reason.</td>
         
 
         <footer>
-            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Thu Dec 19 2024 19:20:36 GMT+0000 (Coordinated Universal Time)
+            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Fri Dec 20 2024 00:14:55 GMT+0000 (Coordinated Universal Time)
         </footer>
     </div>
 </div>
index 3330c68fa18fa8cf1d306091fa5a9ab53d162244..f0ba952eb7d2e4817bf752a52393d84d400c5ca9 100644 (file)
@@ -86,6 +86,8 @@
             
                 <li data-name="LuCI#hasViewPermission"><a href="LuCI.html#hasViewPermission">hasViewPermission</a></li>
             
+                <li data-name="LuCI#isArguments"><a href="LuCI.html#isArguments">isArguments</a></li>
+            
                 <li data-name="LuCI#isObject"><a href="LuCI.html#isObject">isObject</a></li>
             
                 <li data-name="LuCI#location"><a href="LuCI.html#location">location</a></li>
@@ -3663,7 +3665,7 @@ response objects using the <code>response.headers</code> property.</p></div>
     
         
         <div class="tag-source">
-            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line332">line 332</a>
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line289">line 289</a>
         </div>
         
     </div>
@@ -3748,7 +3750,7 @@ response objects using the <code>response.headers</code> property.</p></div>
     
         
         <div class="tag-source">
-            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line380">line 380</a>
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line337">line 337</a>
         </div>
         
     </div>
@@ -3897,7 +3899,7 @@ Note: Header-Names are case-insensitive.</p>
     
         
         <div class="tag-source">
-            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line364">line 364</a>
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line321">line 321</a>
         </div>
         
     </div>
@@ -4051,7 +4053,7 @@ Note: Header-Names are case-insensitive.</p>
         
 
         <footer>
-            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Thu Dec 19 2024 19:20:36 GMT+0000 (Coordinated Universal Time)
+            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Fri Dec 20 2024 00:14:55 GMT+0000 (Coordinated Universal Time)
         </footer>
     </div>
 </div>
index 9a5c5ae3259f150fd8c78c852307d3c3a8c1f80a..bec1882d42d39bcdbc30eadc1c99aef8c9dbe7bd 100644 (file)
@@ -86,6 +86,8 @@
             
                 <li data-name="LuCI#hasViewPermission"><a href="LuCI.html#hasViewPermission">hasViewPermission</a></li>
             
+                <li data-name="LuCI#isArguments"><a href="LuCI.html#isArguments">isArguments</a></li>
+            
                 <li data-name="LuCI#isObject"><a href="LuCI.html#isObject">isObject</a></li>
             
                 <li data-name="LuCI#location"><a href="LuCI.html#location">location</a></li>
@@ -4179,7 +4181,7 @@ to request the <code>LuCI.view</code> class.</p>
     
         
         <div class="tag-source">
-            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line2393">line 2393</a>
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line2342">line 2342</a>
         </div>
         
     </div>
@@ -4391,7 +4393,7 @@ as parameters.</p></td>
     
         
         <div class="tag-source">
-            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line2352">line 2352</a>
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line2301">line 2301</a>
         </div>
         
     </div>
@@ -4630,7 +4632,7 @@ argument or copied from the given error instance.</p>
     
         
         <div class="tag-source">
-            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line2773">line 2773</a>
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line2715">line 2715</a>
         </div>
         
     </div>
@@ -4785,7 +4787,7 @@ document root.</p>
     
         
         <div class="tag-source">
-            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line3122">line 3122</a>
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line3074">line 3074</a>
         </div>
         
     </div>
@@ -4997,7 +4999,7 @@ callback function. The function is a wrapper around
     
         
         <div class="tag-source">
-            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line3260">line 3260</a>
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line3209">line 3209</a>
         </div>
         
     </div>
@@ -5100,7 +5102,7 @@ when it didn't run to begin with.</td>
     
         
         <div class="tag-source">
-            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line2651">line 2651</a>
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line2597">line 2597</a>
         </div>
         
     </div>
@@ -5293,7 +5295,7 @@ has no sub-features.</td>
     
         
         <div class="tag-source">
-            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line3226">line 3226</a>
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line3175">line 3175</a>
         </div>
         
     </div>
@@ -5386,6 +5388,159 @@ group is granted with write permissions.</td>
     
     
     
+</dd>
+
+        
+            
+<dt>
+    <div class="nameContainer">
+        <h4 class="name" id="isArguments">
+            
+            isArguments<span class="signature">(<span class="optional">val</span>)</span><span class="glyphicon glyphicon-circle-arrow-right"></span><span class="type-signature returnType">{boolean}</span>
+        </h4>
+    
+        
+        <div class="tag-source">
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line2885">line 2885</a>
+        </div>
+        
+    </div>
+
+    
+</dt>
+<dd>
+    
+    
+    <div class="description">
+        <p>Tests whether the passed argument is a function arguments object.</p>
+    </div>
+    
+
+    
+    
+    
+    
+    
+        
+
+<table class="params">
+    <thead>
+       <tr>
+               
+               <th>Name</th>
+               
+               
+               <th>Type</th>
+               
+               
+               
+               <th class="last">Description</th>
+       </tr>
+       </thead>
+       
+       <tbody>
+       
+       
+        <tr>
+            
+                <td class="name"><code>val</code></td>
+            
+            
+            <td class="type">
+            
+                
+<span class="param-type">*</span>
+
+
+            
+            </td>
+            
+            
+            
+            <td class="description last">
+                
+                    
+                        <span class="optional">optional</span>
+                    
+                    
+                        
+                    
+                
+                <p>The value to test</p></td>
+        </tr>
+       
+       
+       </tbody>
+</table>
+    
+    
+    
+<dl class="details">
+    
+        
+    
+    
+    
+
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+</dl>
+
+    
+    
+
+    
+
+    
+    
+    
+    
+    
+    <h5>Returns:</h5>
+    
+
+
+<table class="params">
+    <thead>
+    <tr>
+        
+        <th>Type</th>
+        <th class="last">Description</th>
+    </tr>
+    </thead>
+    <tbody>
+    
+        <tr>
+            
+            <td class="type">
+            
+                        boolean
+                        
+                    
+            </td>
+            <td class="description last">Returns <code>true</code> if the given value is a function arguments object,
+else returns <code>false</code>.</td>
+        </tr>
+    
+    </tbody>
+</table>
+
+    
+    
+    
 </dd>
 
         
@@ -5399,7 +5554,7 @@ group is granted with write permissions.</td>
     
         
         <div class="tag-source">
-            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line2927">line 2927</a>
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line2868">line 2868</a>
         </div>
         
     </div>
@@ -5554,7 +5709,7 @@ not <code>null</code>, else returns <code>false</code>.</td>
     
         
         <div class="tag-source">
-            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line2907">line 2907</a>
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line2848">line 2848</a>
         </div>
         
     </div>
@@ -5654,7 +5809,7 @@ not <code>null</code>, else returns <code>false</code>.</td>
     
         
         <div class="tag-source">
-            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line2894">line 2894</a>
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line2835">line 2835</a>
         </div>
         
     </div>
@@ -5813,7 +5968,7 @@ slashes and any of the other characters mentioned above.</p></td>
     
         
         <div class="tag-source">
-            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line2813">line 2813</a>
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line2754">line 2754</a>
         </div>
         
     </div>
@@ -6002,7 +6157,7 @@ slashes and any of the other characters mentioned above.</p></td>
     
         
         <div class="tag-source">
-            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line3192">line 3192</a>
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line3144">line 3144</a>
         </div>
         
     </div>
@@ -6307,7 +6462,7 @@ polling request.</td>
     
         
         <div class="tag-source">
-            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line3150">line 3150</a>
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line3102">line 3102</a>
         </div>
         
     </div>
@@ -6522,7 +6677,7 @@ by default.</p>
     
         
         <div class="tag-source">
-            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line2286">line 2286</a>
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line2235">line 2235</a>
         </div>
         
     </div>
@@ -6761,7 +6916,7 @@ argument or copied from the given error instance.</p>
     
         
         <div class="tag-source">
-            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line2432">line 2432</a>
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line2381">line 2381</a>
         </div>
         
     </div>
@@ -7019,7 +7174,7 @@ class instance.</p>
     
         
         <div class="tag-source">
-            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line3077">line 3077</a>
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line3029">line 3029</a>
         </div>
         
     </div>
@@ -7190,7 +7345,7 @@ to the given default value on error.</td>
     
         
         <div class="tag-source">
-            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line2870">line 2870</a>
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line2811">line 2811</a>
         </div>
         
     </div>
@@ -7349,7 +7504,7 @@ slashes and any of the other characters mentioned above.</p></td>
     
         
         <div class="tag-source">
-            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line3273">line 3273</a>
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line3222">line 3222</a>
         </div>
         
     </div>
@@ -7452,7 +7607,7 @@ when it was already running.</td>
     
         
         <div class="tag-source">
-            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line3022">line 3022</a>
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line2974">line 2974</a>
         </div>
         
     </div>
@@ -7609,7 +7764,7 @@ and the sorting is performed in-place.</p>
     
         
         <div class="tag-source">
-            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line2956">line 2956</a>
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line2914">line 2914</a>
         </div>
         
     </div>
@@ -7832,7 +7987,7 @@ addresses or numeric values respectively.</p></td>
     
         
         <div class="tag-source">
-            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line3247">line 3247</a>
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line3196">line 3196</a>
         </div>
         
     </div>
@@ -7980,7 +8135,7 @@ it could not be found.</td>
     
         
         <div class="tag-source">
-            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line3043">line 3043</a>
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line2995">line 2995</a>
         </div>
         
     </div>
@@ -8130,7 +8285,7 @@ space and returned as array.</p>
     
         
         <div class="tag-source">
-            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line2846">line 2846</a>
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line2787">line 2787</a>
         </div>
         
     </div>
@@ -8295,7 +8450,7 @@ slashes and any of the other characters mentioned above.</p></td>
     
         
         <div class="tag-source">
-            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line3081">line 3081</a>
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line3033">line 3033</a>
         </div>
         
     </div>
@@ -8466,7 +8621,7 @@ else <code>null</code>.</p></td>
         
 
         <footer>
-            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Thu Dec 19 2024 19:20:35 GMT+0000 (Coordinated Universal Time)
+            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Fri Dec 20 2024 00:14:55 GMT+0000 (Coordinated Universal Time)
         </footer>
     </div>
 </div>
index dbb51e93ea514083d7f69918b5679758b185df58..420b72113f60771e3aedf4180045558dbbf789fa 100644 (file)
@@ -86,6 +86,8 @@
             
                 <li data-name="LuCI#hasViewPermission"><a href="LuCI.html#hasViewPermission">hasViewPermission</a></li>
             
+                <li data-name="LuCI#isArguments"><a href="LuCI.html#isArguments">isArguments</a></li>
+            
                 <li data-name="LuCI#isObject"><a href="LuCI.html#isObject">isObject</a></li>
             
                 <li data-name="LuCI#location"><a href="LuCI.html#location">location</a></li>
@@ -6416,7 +6418,7 @@ when it is down or absent.</td>
         
 
         <footer>
-            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Thu Dec 19 2024 19:20:36 GMT+0000 (Coordinated Universal Time)
+            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Fri Dec 20 2024 00:14:55 GMT+0000 (Coordinated Universal Time)
         </footer>
     </div>
 </div>
index b19d3d2f8ae0c0146c6b3a42d7cc5ee76069f59f..35d46ba61e3272e189bb6e97da16ee7700b88d59 100644 (file)
@@ -86,6 +86,8 @@
             
                 <li data-name="LuCI#hasViewPermission"><a href="LuCI.html#hasViewPermission">hasViewPermission</a></li>
             
+                <li data-name="LuCI#isArguments"><a href="LuCI.html#isArguments">isArguments</a></li>
+            
                 <li data-name="LuCI#isObject"><a href="LuCI.html#isObject">isObject</a></li>
             
                 <li data-name="LuCI#location"><a href="LuCI.html#location">location</a></li>
@@ -4977,7 +4979,7 @@ is used as hint.</td>
         
 
         <footer>
-            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Thu Dec 19 2024 19:20:36 GMT+0000 (Coordinated Universal Time)
+            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Fri Dec 20 2024 00:14:55 GMT+0000 (Coordinated Universal Time)
         </footer>
     </div>
 </div>
index 3f28281adc07074ed42172beacfd58d94f2721ac..03de36e2194a35e197d9331b690959cce07a206b 100644 (file)
@@ -86,6 +86,8 @@
             
                 <li data-name="LuCI#hasViewPermission"><a href="LuCI.html#hasViewPermission">hasViewPermission</a></li>
             
+                <li data-name="LuCI#isArguments"><a href="LuCI.html#isArguments">isArguments</a></li>
+            
                 <li data-name="LuCI#isObject"><a href="LuCI.html#isObject">isObject</a></li>
             
                 <li data-name="LuCI#location"><a href="LuCI.html#location">location</a></li>
@@ -8313,7 +8315,7 @@ configuration.</p></td>
         
 
         <footer>
-            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Thu Dec 19 2024 19:20:36 GMT+0000 (Coordinated Universal Time)
+            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Fri Dec 20 2024 00:14:55 GMT+0000 (Coordinated Universal Time)
         </footer>
     </div>
 </div>
index ae58d88efb57adc02e4cb858fa75d9d4eeb3700e..83b3217874eb46154d9fdd0c59931e2ef31c9f9e 100644 (file)
@@ -86,6 +86,8 @@
             
                 <li data-name="LuCI#hasViewPermission"><a href="LuCI.html#hasViewPermission">hasViewPermission</a></li>
             
+                <li data-name="LuCI#isArguments"><a href="LuCI.html#isArguments">isArguments</a></li>
+            
                 <li data-name="LuCI#isObject"><a href="LuCI.html#isObject">isObject</a></li>
             
                 <li data-name="LuCI#location"><a href="LuCI.html#location">location</a></li>
@@ -5354,7 +5356,7 @@ configuration.</p></td>
         
 
         <footer>
-            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Thu Dec 19 2024 19:20:36 GMT+0000 (Coordinated Universal Time)
+            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Fri Dec 20 2024 00:14:55 GMT+0000 (Coordinated Universal Time)
         </footer>
     </div>
 </div>
index 325747374ee99daee3b69ea2898fe959857b5800..78ad457df148b580bd7cf528f137758bca9e4642 100644 (file)
@@ -86,6 +86,8 @@
             
                 <li data-name="LuCI#hasViewPermission"><a href="LuCI.html#hasViewPermission">hasViewPermission</a></li>
             
+                <li data-name="LuCI#isArguments"><a href="LuCI.html#isArguments">isArguments</a></li>
+            
                 <li data-name="LuCI#isObject"><a href="LuCI.html#isObject">isObject</a></li>
             
                 <li data-name="LuCI#location"><a href="LuCI.html#location">location</a></li>
@@ -7938,7 +7940,7 @@ configuration.</p></td>
         
 
         <footer>
-            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Thu Dec 19 2024 19:20:36 GMT+0000 (Coordinated Universal Time)
+            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Fri Dec 20 2024 00:14:55 GMT+0000 (Coordinated Universal Time)
         </footer>
     </div>
 </div>
index 85d88868f7db6a6bb7ea9b590f25bac065cbd739..9881ec643dccd76166a3dd3faad47df3aec3c340 100644 (file)
@@ -86,6 +86,8 @@
             
                 <li data-name="LuCI#hasViewPermission"><a href="LuCI.html#hasViewPermission">hasViewPermission</a></li>
             
+                <li data-name="LuCI#isArguments"><a href="LuCI.html#isArguments">isArguments</a></li>
+            
                 <li data-name="LuCI#isObject"><a href="LuCI.html#isObject">isObject</a></li>
             
                 <li data-name="LuCI#location"><a href="LuCI.html#location">location</a></li>
@@ -9881,7 +9883,7 @@ conjunction with <code>quality</code> to calculate a quality percentage.</p></td
         
 
         <footer>
-            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Thu Dec 19 2024 19:20:36 GMT+0000 (Coordinated Universal Time)
+            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Fri Dec 20 2024 00:14:55 GMT+0000 (Coordinated Universal Time)
         </footer>
     </div>
 </div>
index b2d497afaab71267628ff911e697cb7b83e4554d..eb6ea2845e6c6e7068514d9481ccca37145d8a8f 100644 (file)
@@ -86,6 +86,8 @@
             
                 <li data-name="LuCI#hasViewPermission"><a href="LuCI.html#hasViewPermission">hasViewPermission</a></li>
             
+                <li data-name="LuCI#isArguments"><a href="LuCI.html#isArguments">isArguments</a></li>
+            
                 <li data-name="LuCI#isObject"><a href="LuCI.html#isObject">isObject</a></li>
             
                 <li data-name="LuCI#location"><a href="LuCI.html#location">location</a></li>
@@ -3664,7 +3666,7 @@ loop.</p></div>
     
         
         <div class="tag-source">
-            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line1041">line 1041</a>
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line994">line 994</a>
         </div>
         
     </div>
@@ -3749,7 +3751,7 @@ loop.</p></div>
     
         
         <div class="tag-source">
-            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line1202">line 1202</a>
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line1155">line 1155</a>
         </div>
         
     </div>
@@ -3851,7 +3853,7 @@ loop.</p></div>
     
         
         <div class="tag-source">
-            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line1075">line 1075</a>
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line1028">line 1028</a>
         </div>
         
     </div>
@@ -4048,7 +4050,7 @@ already is registered.</td>
     
         
         <div class="tag-source">
-            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line1116">line 1116</a>
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line1069">line 1069</a>
         </div>
         
     </div>
@@ -4222,7 +4224,7 @@ wasn't found.</td>
     
         
         <div class="tag-source">
-            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line1142">line 1142</a>
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line1095">line 1095</a>
         </div>
         
     </div>
@@ -4324,7 +4326,7 @@ where registered) or <code>false</code> when the polling loop already runs.</td>
     
         
         <div class="tag-source">
-            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line1167">line 1167</a>
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line1120">line 1120</a>
         </div>
         
     </div>
@@ -4434,7 +4436,7 @@ run to begin with.</td>
         
 
         <footer>
-            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Thu Dec 19 2024 19:20:36 GMT+0000 (Coordinated Universal Time)
+            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Fri Dec 20 2024 00:14:55 GMT+0000 (Coordinated Universal Time)
         </footer>
     </div>
 </div>
index f6bf7933ddfd9dbedc45efc29e35238d4a45ad87..de4390beca24ca79a67751bac95b64c8c837aab0 100644 (file)
@@ -86,6 +86,8 @@
             
                 <li data-name="LuCI#hasViewPermission"><a href="LuCI.html#hasViewPermission">hasViewPermission</a></li>
             
+                <li data-name="LuCI#isArguments"><a href="LuCI.html#isArguments">isArguments</a></li>
+            
                 <li data-name="LuCI#isObject"><a href="LuCI.html#isObject">isObject</a></li>
             
                 <li data-name="LuCI#location"><a href="LuCI.html#location">location</a></li>
@@ -3663,7 +3665,7 @@ for dealing with responses.</p></div>
     
         
         <div class="tag-source">
-            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line604">line 604</a>
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line560">line 560</a>
         </div>
         
     </div>
@@ -3755,7 +3757,7 @@ for dealing with responses.</p></div>
     
         
         <div class="tag-source">
-            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line895">line 895</a>
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line850">line 850</a>
         </div>
         
     </div>
@@ -3903,7 +3905,7 @@ implementing request retries before returning a failure.</p>
     
         
         <div class="tag-source">
-            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line630">line 630</a>
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line586">line 586</a>
         </div>
         
     </div>
@@ -4049,7 +4051,7 @@ if it already was absolute.</td>
     
         
         <div class="tag-source">
-            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line848">line 848</a>
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line803">line 803</a>
         </div>
         
     </div>
@@ -4229,7 +4231,7 @@ if it already was absolute.</td>
     
         
         <div class="tag-source">
-            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line869">line 869</a>
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line824">line 824</a>
         </div>
         
     </div>
@@ -4439,7 +4441,7 @@ if it already was absolute.</td>
     
         
         <div class="tag-source">
-            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line914">line 914</a>
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line869">line 869</a>
         </div>
         
     </div>
@@ -4586,7 +4588,7 @@ function.</p>
     
         
         <div class="tag-source">
-            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line697">line 697</a>
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line653">line 653</a>
         </div>
         
     </div>
@@ -4772,7 +4774,7 @@ function.</p>
     
         
         <div class="tag-source">
-            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line873">line 873</a>
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line828">line 828</a>
         </div>
         
     </div>
@@ -5369,7 +5371,7 @@ instances as sole argument during the HTTP request transfer.</p></td>
         
 
         <footer>
-            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Thu Dec 19 2024 19:20:36 GMT+0000 (Coordinated Universal Time)
+            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Fri Dec 20 2024 00:14:55 GMT+0000 (Coordinated Universal Time)
         </footer>
     </div>
 </div>
index 0d4087859a6d00aba2b42c45dfc5288bc43805c0..cea8fa27d2bbc93251dfa52099e36abf5d9d5752 100644 (file)
@@ -86,6 +86,8 @@
             
                 <li data-name="LuCI#hasViewPermission"><a href="LuCI.html#hasViewPermission">hasViewPermission</a></li>
             
+                <li data-name="LuCI#isArguments"><a href="LuCI.html#isArguments">isArguments</a></li>
+            
                 <li data-name="LuCI#isObject"><a href="LuCI.html#isObject">isObject</a></li>
             
                 <li data-name="LuCI#location"><a href="LuCI.html#location">location</a></li>
@@ -3664,7 +3666,7 @@ request calls as polling functions.</p></div>
     
         
         <div class="tag-source">
-            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line932">line 932</a>
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line888">line 888</a>
         </div>
         
     </div>
@@ -3749,7 +3751,7 @@ request calls as polling functions.</p></div>
     
         
         <div class="tag-source">
-            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line1037">line 1037</a>
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line990">line 990</a>
         </div>
         
     </div>
@@ -3820,7 +3822,7 @@ request calls as polling functions.</p></div>
     
         
         <div class="tag-source">
-            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line975">line 975</a>
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line931">line 931</a>
         </div>
         
     </div>
@@ -4087,7 +4089,7 @@ invoke for each HTTP reply.</p></td>
     
         
         <div class="tag-source">
-            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line1013">line 1013</a>
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line966">line 966</a>
         </div>
         
     </div>
@@ -4234,7 +4236,7 @@ This function is essentially a wrapper around
     
         
         <div class="tag-source">
-            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line1021">line 1021</a>
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line974">line 974</a>
         </div>
         
     </div>
@@ -4305,7 +4307,7 @@ This function is essentially a wrapper around
     
         
         <div class="tag-source">
-            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line1029">line 1029</a>
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line982">line 982</a>
         </div>
         
     </div>
@@ -4382,7 +4384,7 @@ This function is essentially a wrapper around
     
         
         <div class="tag-source">
-            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line933">line 933</a>
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line889">line 889</a>
         </div>
         
     </div>
@@ -4553,7 +4555,7 @@ else <code>null</code>.</p></td>
         
 
         <footer>
-            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Thu Dec 19 2024 19:20:36 GMT+0000 (Coordinated Universal Time)
+            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Fri Dec 20 2024 00:14:55 GMT+0000 (Coordinated Universal Time)
         </footer>
     </div>
 </div>
index e525805711174e6acd1cb5090363058033cb53db..4617a46850e07204b72a42b38eb55a53aeec10d1 100644 (file)
@@ -86,6 +86,8 @@
             
                 <li data-name="LuCI#hasViewPermission"><a href="LuCI.html#hasViewPermission">hasViewPermission</a></li>
             
+                <li data-name="LuCI#isArguments"><a href="LuCI.html#isArguments">isArguments</a></li>
+            
                 <li data-name="LuCI#isObject"><a href="LuCI.html#isObject">isObject</a></li>
             
                 <li data-name="LuCI#location"><a href="LuCI.html#location">location</a></li>
     
         
         <div class="tag-source">
-            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line386">line 386</a>
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line343">line 343</a>
         </div>
         
     </div>
     
         
         <div class="tag-source">
-            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line548">line 548</a>
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line505">line 505</a>
         </div>
         
     </div>
     
         
         <div class="tag-source">
-            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line497">line 497</a>
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line454">line 454</a>
         </div>
         
     </div>
@@ -4276,7 +4278,7 @@ using <code>String()</code> and treated as response text.</p></td>
     
         
         <div class="tag-source">
-            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line518">line 518</a>
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line475">line 475</a>
         </div>
         
     </div>
@@ -4403,7 +4405,7 @@ using <code>String()</code> and treated as response text.</p></td>
     
         
         <div class="tag-source">
-            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line533">line 533</a>
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line490">line 490</a>
         </div>
         
     </div>
@@ -4511,7 +4513,7 @@ using <code>String()</code> and treated as response text.</p></td>
         
 
         <footer>
-            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Thu Dec 19 2024 19:20:36 GMT+0000 (Coordinated Universal Time)
+            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Fri Dec 20 2024 00:14:55 GMT+0000 (Coordinated Universal Time)
         </footer>
     </div>
 </div>
index 57516b945753a799291bed9765e1c7bc6594eb42..9762f9e761e82a549b31760b5a3bfdd4531ccdce 100644 (file)
@@ -86,6 +86,8 @@
             
                 <li data-name="LuCI#hasViewPermission"><a href="LuCI.html#hasViewPermission">hasViewPermission</a></li>
             
+                <li data-name="LuCI#isArguments"><a href="LuCI.html#isArguments">isArguments</a></li>
+            
                 <li data-name="LuCI#isObject"><a href="LuCI.html#isObject">isObject</a></li>
             
                 <li data-name="LuCI#location"><a href="LuCI.html#location">location</a></li>
@@ -3748,7 +3750,7 @@ and means for listing and invoking remove RPC methods.</p></div>
     
         
         <div class="tag-source">
-            <a href="rpc.js.html">rpc.js</a>, <a href="rpc.js.html#line462">line 462</a>
+            <a href="rpc.js.html">rpc.js</a>, <a href="rpc.js.html#line458">line 458</a>
         </div>
         
     </div>
@@ -3893,7 +3895,7 @@ and means for listing and invoking remove RPC methods.</p></div>
     
         
         <div class="tag-source">
-            <a href="rpc.js.html">rpc.js</a>, <a href="rpc.js.html#line299">line 299</a>
+            <a href="rpc.js.html">rpc.js</a>, <a href="rpc.js.html#line296">line 296</a>
         </div>
         
     </div>
@@ -4041,7 +4043,7 @@ signatures of each given object.</p></td>
     
         
         <div class="tag-source">
-            <a href="rpc.js.html">rpc.js</a>, <a href="rpc.js.html#line375">line 375</a>
+            <a href="rpc.js.html">rpc.js</a>, <a href="rpc.js.html#line371">line 371</a>
         </div>
         
     </div>
@@ -4141,7 +4143,7 @@ signatures of each given object.</p></td>
     
         
         <div class="tag-source">
-            <a href="rpc.js.html">rpc.js</a>, <a href="rpc.js.html#line354">line 354</a>
+            <a href="rpc.js.html">rpc.js</a>, <a href="rpc.js.html#line350">line 350</a>
         </div>
         
     </div>
@@ -4242,7 +4244,7 @@ requests.</td>
     
         
         <div class="tag-source">
-            <a href="rpc.js.html">rpc.js</a>, <a href="rpc.js.html#line399">line 399</a>
+            <a href="rpc.js.html">rpc.js</a>, <a href="rpc.js.html#line395">line 395</a>
         </div>
         
     </div>
@@ -4555,7 +4557,7 @@ signatures of each requested <code>ubus</code> object name will be returned.</td
     
         
         <div class="tag-source">
-            <a href="rpc.js.html">rpc.js</a>, <a href="rpc.js.html#line478">line 478</a>
+            <a href="rpc.js.html">rpc.js</a>, <a href="rpc.js.html#line475">line 475</a>
         </div>
         
     </div>
@@ -4701,7 +4703,7 @@ if it has not been found.</td>
     
         
         <div class="tag-source">
-            <a href="rpc.js.html">rpc.js</a>, <a href="rpc.js.html#line385">line 385</a>
+            <a href="rpc.js.html">rpc.js</a>, <a href="rpc.js.html#line381">line 381</a>
         </div>
         
     </div>
@@ -4817,7 +4819,7 @@ if it has not been found.</td>
     
         
         <div class="tag-source">
-            <a href="rpc.js.html">rpc.js</a>, <a href="rpc.js.html#line365">line 365</a>
+            <a href="rpc.js.html">rpc.js</a>, <a href="rpc.js.html#line361">line 361</a>
         </div>
         
     </div>
@@ -5271,7 +5273,7 @@ behaviour is to resolve with the call return code value instead.</p></td>
     
         
         <div class="tag-source">
-            <a href="rpc.js.html">rpc.js</a>, <a href="rpc.js.html#line238">line 238</a>
+            <a href="rpc.js.html">rpc.js</a>, <a href="rpc.js.html#line235">line 235</a>
         </div>
         
     </div>
@@ -5484,7 +5486,7 @@ of the RPC method as-is.</td>
     
         
         <div class="tag-source">
-            <a href="rpc.js.html">rpc.js</a>, <a href="rpc.js.html#line416">line 416</a>
+            <a href="rpc.js.html">rpc.js</a>, <a href="rpc.js.html#line412">line 412</a>
         </div>
         
     </div>
@@ -5672,7 +5674,7 @@ function will fail too, forwarding the error to the caller.</td>
     
         
         <div class="tag-source">
-            <a href="rpc.js.html">rpc.js</a>, <a href="rpc.js.html#line261">line 261</a>
+            <a href="rpc.js.html">rpc.js</a>, <a href="rpc.js.html#line258">line 258</a>
         </div>
         
     </div>
@@ -5842,7 +5844,7 @@ to the <code>expect</code> and <code>filter</code> declarations.</td>
         
 
         <footer>
-            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Thu Dec 19 2024 19:20:36 GMT+0000 (Coordinated Universal Time)
+            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Fri Dec 20 2024 00:14:55 GMT+0000 (Coordinated Universal Time)
         </footer>
     </div>
 </div>
index 7f02bb26dee94e678cd06f0c4bdcab3805f9091a..c25200bdbb398ad57e8f736fce42444d905ee69e 100644 (file)
@@ -86,6 +86,8 @@
             
                 <li data-name="LuCI#hasViewPermission"><a href="LuCI.html#hasViewPermission">hasViewPermission</a></li>
             
+                <li data-name="LuCI#isArguments"><a href="LuCI.html#isArguments">isArguments</a></li>
+            
                 <li data-name="LuCI#isObject"><a href="LuCI.html#isObject">isObject</a></li>
             
                 <li data-name="LuCI#location"><a href="LuCI.html#location">location</a></li>
     
         
         <div class="tag-source">
-            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line1822">line 1822</a>
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line1772">line 1772</a>
         </div>
         
     </div>
     
         
         <div class="tag-source">
-            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line1839">line 1839</a>
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line1789">line 1789</a>
         </div>
         
     </div>
     
         
         <div class="tag-source">
-            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line1864">line 1864</a>
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line1814">line 1814</a>
         </div>
         
     </div>
@@ -4001,7 +4003,7 @@ found.</td>
     
         
         <div class="tag-source">
-            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line1849">line 1849</a>
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line1799">line 1799</a>
         </div>
         
     </div>
@@ -4104,7 +4106,7 @@ found.</td>
     
         
         <div class="tag-source">
-            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line1898">line 1898</a>
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line1848">line 1848</a>
         </div>
         
     </div>
@@ -4281,7 +4283,7 @@ being put in the session store.</p></td>
         
 
         <footer>
-            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Thu Dec 19 2024 19:20:36 GMT+0000 (Coordinated Universal Time)
+            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Fri Dec 20 2024 00:14:55 GMT+0000 (Coordinated Universal Time)
         </footer>
     </div>
 </div>
index a3b052d2ea4b7d9a01cb78c9a6d27ffdaa10f950..899f61a2998c3619a12c6d46e022b9143b70ed77 100644 (file)
@@ -86,6 +86,8 @@
             
                 <li data-name="LuCI#hasViewPermission"><a href="LuCI.html#hasViewPermission">hasViewPermission</a></li>
             
+                <li data-name="LuCI#isArguments"><a href="LuCI.html#isArguments">isArguments</a></li>
+            
                 <li data-name="LuCI#isObject"><a href="LuCI.html#isObject">isObject</a></li>
             
                 <li data-name="LuCI#location"><a href="LuCI.html#location">location</a></li>
@@ -3750,7 +3752,7 @@ UCI configuration data.</p></div>
     
         
         <div class="tag-source">
-            <a href="uci.js.html">uci.js</a>, <a href="uci.js.html#line291">line 291</a>
+            <a href="uci.js.html">uci.js</a>, <a href="uci.js.html#line289">line 289</a>
         </div>
         
     </div>
@@ -3961,7 +3963,7 @@ to the given name for non-anonymous sections.</td>
     
         
         <div class="tag-source">
-            <a href="uci.js.html">uci.js</a>, <a href="uci.js.html#line957">line 957</a>
+            <a href="uci.js.html">uci.js</a>, <a href="uci.js.html#line940">line 940</a>
         </div>
         
     </div>
@@ -4123,7 +4125,7 @@ operation to cancel the rollback timer.</p>
     
         
         <div class="tag-source">
-            <a href="uci.js.html">uci.js</a>, <a href="uci.js.html#line1037">line 1037</a>
+            <a href="uci.js.html">uci.js</a>, <a href="uci.js.html#line1020">line 1020</a>
         </div>
         
     </div>
@@ -4224,7 +4226,7 @@ names as keys and arrays of related change records as values.</td>
     
         
         <div class="tag-source">
-            <a href="uci.js.html">uci.js</a>, <a href="uci.js.html#line333">line 333</a>
+            <a href="uci.js.html">uci.js</a>, <a href="uci.js.html#line329">line 329</a>
         </div>
         
     </div>
@@ -4642,7 +4644,7 @@ where <code>X</code> denotes a hexadecimal digit.</td>
     
         
         <div class="tag-source">
-            <a href="uci.js.html">uci.js</a>, <a href="uci.js.html#line513">line 513</a>
+            <a href="uci.js.html">uci.js</a>, <a href="uci.js.html#line506">line 506</a>
         </div>
         
     </div>
@@ -4871,7 +4873,7 @@ found or if the corresponding configuration is not loaded.</li>
     
         
         <div class="tag-source">
-            <a href="uci.js.html">uci.js</a>, <a href="uci.js.html#line713">line 713</a>
+            <a href="uci.js.html">uci.js</a>, <a href="uci.js.html#line697">line 697</a>
         </div>
         
     </div>
@@ -5104,7 +5106,7 @@ found or if the corresponding configuration is not loaded.</li>
     
         
         <div class="tag-source">
-            <a href="uci.js.html">uci.js</a>, <a href="uci.js.html#line227">line 227</a>
+            <a href="uci.js.html">uci.js</a>, <a href="uci.js.html#line225">line 225</a>
         </div>
         
     </div>
@@ -5259,7 +5261,7 @@ that have been successfully loaded.</td>
     
         
         <div class="tag-source">
-            <a href="uci.js.html">uci.js</a>, <a href="uci.js.html#line813">line 813</a>
+            <a href="uci.js.html">uci.js</a>, <a href="uci.js.html#line795">line 795</a>
         </div>
         
     </div>
@@ -5528,7 +5530,7 @@ when either the section specified by <code>sid1</code> or by <code>sid2</code> i
     
         
         <div class="tag-source">
-            <a href="uci.js.html">uci.js</a>, <a href="uci.js.html#line365">line 365</a>
+            <a href="uci.js.html">uci.js</a>, <a href="uci.js.html#line361">line 361</a>
         </div>
         
     </div>
@@ -5845,7 +5847,7 @@ not be resolved to existing section ID.</td>
     
         
         <div class="tag-source">
-            <a href="uci.js.html">uci.js</a>, <a href="uci.js.html#line867">line 867</a>
+            <a href="uci.js.html">uci.js</a>, <a href="uci.js.html#line850">line 850</a>
         </div>
         
     </div>
@@ -5949,7 +5951,7 @@ have been reloaded by the save operation.</td>
     
         
         <div class="tag-source">
-            <a href="uci.js.html">uci.js</a>, <a href="uci.js.html#line454">line 454</a>
+            <a href="uci.js.html">uci.js</a>, <a href="uci.js.html#line447">line 447</a>
         </div>
         
     </div>
@@ -6162,7 +6164,7 @@ configuration, filtered by type, if a type has been specified.</td>
     
         
         <div class="tag-source">
-            <a href="uci.js.html">uci.js</a>, <a href="uci.js.html#line601">line 601</a>
+            <a href="uci.js.html">uci.js</a>, <a href="uci.js.html#line591">line 591</a>
         </div>
         
     </div>
@@ -6358,7 +6360,7 @@ with the given value.</p></td>
     
         
         <div class="tag-source">
-            <a href="uci.js.html">uci.js</a>, <a href="uci.js.html#line748">line 748</a>
+            <a href="uci.js.html">uci.js</a>, <a href="uci.js.html#line731">line 731</a>
         </div>
         
     </div>
@@ -6579,7 +6581,7 @@ with the given value.</p></td>
     
         
         <div class="tag-source">
-            <a href="uci.js.html">uci.js</a>, <a href="uci.js.html#line259">line 259</a>
+            <a href="uci.js.html">uci.js</a>, <a href="uci.js.html#line257">line 257</a>
         </div>
         
     </div>
@@ -6699,7 +6701,7 @@ names to unload.</p></td>
     
         
         <div class="tag-source">
-            <a href="uci.js.html">uci.js</a>, <a href="uci.js.html#line682">line 682</a>
+            <a href="uci.js.html">uci.js</a>, <a href="uci.js.html#line666">line 666</a>
         </div>
         
     </div>
@@ -6864,7 +6866,7 @@ configuration.</p>
     
         
         <div class="tag-source">
-            <a href="uci.js.html">uci.js</a>, <a href="uci.js.html#line778">line 778</a>
+            <a href="uci.js.html">uci.js</a>, <a href="uci.js.html#line760">line 760</a>
         </div>
         
     </div>
@@ -7451,7 +7453,7 @@ underlying option is an UCI list.</p></td>
     
         
         <div class="tag-source">
-            <a href="uci.js.html">uci.js</a>, <a href="uci.js.html#line422">line 422</a>
+            <a href="uci.js.html">uci.js</a>, <a href="uci.js.html#line415">line 415</a>
         </div>
         
     </div>
@@ -7598,7 +7600,7 @@ associated name as arguments.</p>
         
 
         <footer>
-            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Thu Dec 19 2024 19:20:36 GMT+0000 (Coordinated Universal Time)
+            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Fri Dec 20 2024 00:14:55 GMT+0000 (Coordinated Universal Time)
         </footer>
     </div>
 </div>
index a75d8da5c0602a260cf8bb72449044f769530481..dd99c4213cb299bc7b16da6de589133f58d8d550 100644 (file)
@@ -86,6 +86,8 @@
             
                 <li data-name="LuCI#hasViewPermission"><a href="LuCI.html#hasViewPermission">hasViewPermission</a></li>
             
+                <li data-name="LuCI#isArguments"><a href="LuCI.html#isArguments">isArguments</a></li>
+            
                 <li data-name="LuCI#isObject"><a href="LuCI.html#isObject">isObject</a></li>
             
                 <li data-name="LuCI#location"><a href="LuCI.html#location">location</a></li>
@@ -4340,7 +4342,7 @@ registered.</p></td>
     
         
         <div class="tag-source">
-            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line304">line 304</a>
+            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line303">line 303</a>
         </div>
         
     </div>
@@ -4441,7 +4443,7 @@ widget markup.</td>
     
         
         <div class="tag-source">
-            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line285">line 285</a>
+            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line284">line 284</a>
         </div>
         
     </div>
@@ -5385,7 +5387,7 @@ and are displayed in a slightly faded style.</p></td>
         
 
         <footer>
-            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Thu Dec 19 2024 19:20:36 GMT+0000 (Coordinated Universal Time)
+            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Fri Dec 20 2024 00:14:55 GMT+0000 (Coordinated Universal Time)
         </footer>
     </div>
 </div>
index 00952ffee9e6ec9745696e8f80afc2af72efb41a..e5968bf5ea433fee5181e8a755c037df7484db87 100644 (file)
@@ -86,6 +86,8 @@
             
                 <li data-name="LuCI#hasViewPermission"><a href="LuCI.html#hasViewPermission">hasViewPermission</a></li>
             
+                <li data-name="LuCI#isArguments"><a href="LuCI.html#isArguments">isArguments</a></li>
+            
                 <li data-name="LuCI#isObject"><a href="LuCI.html#isObject">isObject</a></li>
             
                 <li data-name="LuCI#location"><a href="LuCI.html#location">location</a></li>
@@ -3669,7 +3671,7 @@ external JavaScript, use <code>L.require(&quot;ui&quot;).then(...)</code> and ac
     
         
         <div class="tag-source">
-            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line548">line 548</a>
+            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line546">line 546</a>
         </div>
         
     </div>
@@ -3962,7 +3964,7 @@ external JavaScript, use <code>L.require(&quot;ui&quot;).then(...)</code> and ac
     
         
         <div class="tag-source">
-            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line673">line 673</a>
+            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line671">line 671</a>
         </div>
         
     </div>
@@ -4176,7 +4178,7 @@ as changed.</td>
     
         
         <div class="tag-source">
-            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line668">line 668</a>
+            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line666">line 666</a>
         </div>
         
     </div>
@@ -4553,7 +4555,7 @@ registered.</p></td>
     
         
         <div class="tag-source">
-            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line602">line 602</a>
+            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line600">line 600</a>
         </div>
         
     </div>
@@ -4656,7 +4658,7 @@ widget markup.</td>
     
         
         <div class="tag-source">
-            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line285">line 285</a>
+            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line284">line 284</a>
         </div>
         
     </div>
@@ -5097,7 +5099,7 @@ trigger input value validation.</p>
     
         
         <div class="tag-source">
-            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line680">line 680</a>
+            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line678">line 678</a>
         </div>
         
     </div>
@@ -5499,7 +5501,7 @@ it is required for HTML based form submissions.</p></td>
         
 
         <footer>
-            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Thu Dec 19 2024 19:20:36 GMT+0000 (Coordinated Universal Time)
+            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Fri Dec 20 2024 00:14:55 GMT+0000 (Coordinated Universal Time)
         </footer>
     </div>
 </div>
index c27e1eb985152e5b6c18c52be7c7a971c1d11b63..618bc4de26ee212d9b57325358598b3b009374d5 100644 (file)
@@ -86,6 +86,8 @@
             
                 <li data-name="LuCI#hasViewPermission"><a href="LuCI.html#hasViewPermission">hasViewPermission</a></li>
             
+                <li data-name="LuCI#isArguments"><a href="LuCI.html#isArguments">isArguments</a></li>
+            
                 <li data-name="LuCI#isObject"><a href="LuCI.html#isObject">isObject</a></li>
             
                 <li data-name="LuCI#location"><a href="LuCI.html#location">location</a></li>
@@ -3670,7 +3672,7 @@ external JavaScript, use <code>L.require(&quot;ui&quot;).then(...)</code> and ac
     
         
         <div class="tag-source">
-            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line2042">line 2042</a>
+            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line2067">line 2067</a>
         </div>
         
     </div>
@@ -3898,7 +3900,7 @@ choice labels.</p></td>
     
         
         <div class="tag-source">
-            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line1700">line 1700</a>
+            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line1712">line 1712</a>
         </div>
         
     </div>
@@ -4044,7 +4046,7 @@ as label text. Choice labels may be any valid value accepted by
     
         
         <div class="tag-source">
-            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line1665">line 1665</a>
+            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line1677">line 1677</a>
         </div>
         
     </div>
@@ -4181,7 +4183,7 @@ of keeping them.</p></td>
     
         
         <div class="tag-source">
-            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line1733">line 1733</a>
+            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line1745">line 1745</a>
         </div>
         
     </div>
@@ -4736,7 +4738,7 @@ registered.</p></td>
     
         
         <div class="tag-source">
-            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line285">line 285</a>
+            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line284">line 284</a>
         </div>
         
     </div>
@@ -5529,7 +5531,7 @@ choice value as second argument.</p></td>
         
 
         <footer>
-            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Thu Dec 19 2024 19:20:36 GMT+0000 (Coordinated Universal Time)
+            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Fri Dec 20 2024 00:14:55 GMT+0000 (Coordinated Universal Time)
         </footer>
     </div>
 </div>
index 469c79676eed1c199ad68659f6612d813900f964..752a283c772746838aa76ae55ed11216d432055b 100644 (file)
@@ -86,6 +86,8 @@
             
                 <li data-name="LuCI#hasViewPermission"><a href="LuCI.html#hasViewPermission">hasViewPermission</a></li>
             
+                <li data-name="LuCI#isArguments"><a href="LuCI.html#isArguments">isArguments</a></li>
+            
                 <li data-name="LuCI#isObject"><a href="LuCI.html#isObject">isObject</a></li>
             
                 <li data-name="LuCI#location"><a href="LuCI.html#location">location</a></li>
@@ -3672,7 +3674,7 @@ external JavaScript, use <code>L.require(&quot;ui&quot;).then(...)</code> and ac
     
         
         <div class="tag-source">
-            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line1973">line 1973</a>
+            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line1998">line 1998</a>
         </div>
         
     </div>
@@ -3900,7 +3902,7 @@ choice labels.</p></td>
     
         
         <div class="tag-source">
-            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line1700">line 1700</a>
+            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line1712">line 1712</a>
         </div>
         
     </div>
@@ -4046,7 +4048,7 @@ as label text. Choice labels may be any valid value accepted by
     
         
         <div class="tag-source">
-            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line1665">line 1665</a>
+            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line1677">line 1677</a>
         </div>
         
     </div>
@@ -4183,7 +4185,7 @@ of keeping them.</p></td>
     
         
         <div class="tag-source">
-            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line1733">line 1733</a>
+            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line1745">line 1745</a>
         </div>
         
     </div>
@@ -4738,7 +4740,7 @@ registered.</p></td>
     
         
         <div class="tag-source">
-            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line285">line 285</a>
+            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line284">line 284</a>
         </div>
         
     </div>
@@ -5432,7 +5434,7 @@ forcibly set to <code>true</code>.</p></td>
         
 
         <footer>
-            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Thu Dec 19 2024 19:20:36 GMT+0000 (Coordinated Universal Time)
+            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Fri Dec 20 2024 00:14:55 GMT+0000 (Coordinated Universal Time)
         </footer>
     </div>
 </div>
index 9ad510877293b4784a8fcce610db4308ca6935b2..6aa5db76825437fc587f6081bf7ba53bd42e12e1 100644 (file)
@@ -86,6 +86,8 @@
             
                 <li data-name="LuCI#hasViewPermission"><a href="LuCI.html#hasViewPermission">hasViewPermission</a></li>
             
+                <li data-name="LuCI#isArguments"><a href="LuCI.html#isArguments">isArguments</a></li>
+            
                 <li data-name="LuCI#isObject"><a href="LuCI.html#isObject">isObject</a></li>
             
                 <li data-name="LuCI#location"><a href="LuCI.html#location">location</a></li>
@@ -3670,7 +3672,7 @@ external JavaScript, use <code>L.require(&quot;ui&quot;).then(...)</code> and ac
     
         
         <div class="tag-source">
-            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line894">line 894</a>
+            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line892">line 892</a>
         </div>
         
     </div>
@@ -3896,7 +3898,7 @@ choice labels.</p></td>
     
         
         <div class="tag-source">
-            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line1700">line 1700</a>
+            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line1712">line 1712</a>
         </div>
         
     </div>
@@ -4040,7 +4042,7 @@ as label text. Choice labels may be any valid value accepted by
     
         
         <div class="tag-source">
-            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line1665">line 1665</a>
+            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line1677">line 1677</a>
         </div>
         
     </div>
@@ -4175,7 +4177,7 @@ of keeping them.</p></td>
     
         
         <div class="tag-source">
-            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line1733">line 1733</a>
+            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line1745">line 1745</a>
         </div>
         
     </div>
@@ -4350,7 +4352,7 @@ of keeping them.</p></td>
     
         
         <div class="tag-source">
-            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line1961">line 1961</a>
+            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line1986">line 1986</a>
         </div>
         
     </div>
@@ -4841,7 +4843,7 @@ registered.</p></td>
     
         
         <div class="tag-source">
-            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line1048">line 1048</a>
+            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line1046">line 1046</a>
         </div>
         
     </div>
@@ -4944,7 +4946,7 @@ widget markup.</td>
     
         
         <div class="tag-source">
-            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line285">line 285</a>
+            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line284">line 284</a>
         </div>
         
     </div>
@@ -5385,7 +5387,7 @@ trigger input value validation.</p>
     
         
         <div class="tag-source">
-            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line1934">line 1934</a>
+            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line1959">line 1959</a>
         </div>
         
     </div>
@@ -6230,7 +6232,7 @@ expression. Only applicable when <code>create</code> is <code>true</code>.</p></
         
 
         <footer>
-            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Thu Dec 19 2024 19:20:36 GMT+0000 (Coordinated Universal Time)
+            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Fri Dec 20 2024 00:14:55 GMT+0000 (Coordinated Universal Time)
         </footer>
     </div>
 </div>
index bb336225c2aab45fdaa6db3b94fe60edede61896..297d9024684e5a09e702197de10531b127c45396 100644 (file)
@@ -86,6 +86,8 @@
             
                 <li data-name="LuCI#hasViewPermission"><a href="LuCI.html#hasViewPermission">hasViewPermission</a></li>
             
+                <li data-name="LuCI#isArguments"><a href="LuCI.html#isArguments">isArguments</a></li>
+            
                 <li data-name="LuCI#isObject"><a href="LuCI.html#isObject">isObject</a></li>
             
                 <li data-name="LuCI#location"><a href="LuCI.html#location">location</a></li>
@@ -3671,7 +3673,7 @@ external JavaScript, use <code>L.require(&quot;ui&quot;).then(...)</code> and ac
     
         
         <div class="tag-source">
-            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line2158">line 2158</a>
+            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line2183">line 2183</a>
         </div>
         
     </div>
@@ -3901,7 +3903,7 @@ arbitrary values to the dynamic list.</p></td>
     
         
         <div class="tag-source">
-            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line2594">line 2594</a>
+            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line2620">line 2620</a>
         </div>
         
     </div>
@@ -4045,7 +4047,7 @@ as label text. Choice labels may be any valid value accepted by
     
         
         <div class="tag-source">
-            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line2607">line 2607</a>
+            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line2633">line 2633</a>
         </div>
         
     </div>
@@ -4221,7 +4223,7 @@ as label text. Choice labels may be any valid value accepted by
     
         
         <div class="tag-source">
-            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line2545">line 2545</a>
+            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line2571">line 2571</a>
         </div>
         
     </div>
@@ -4712,7 +4714,7 @@ registered.</p></td>
     
         
         <div class="tag-source">
-            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line2227">line 2227</a>
+            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line2252">line 2252</a>
         </div>
         
     </div>
@@ -4815,7 +4817,7 @@ widget markup.</td>
     
         
         <div class="tag-source">
-            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line285">line 285</a>
+            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line284">line 284</a>
         </div>
         
     </div>
@@ -5256,7 +5258,7 @@ trigger input value validation.</p>
     
         
         <div class="tag-source">
-            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line2562">line 2562</a>
+            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line2588">line 2588</a>
         </div>
         
     </div>
@@ -5607,7 +5609,7 @@ it to remain unselected.</p></td>
         
 
         <footer>
-            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Thu Dec 19 2024 19:20:36 GMT+0000 (Coordinated Universal Time)
+            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Fri Dec 20 2024 00:14:55 GMT+0000 (Coordinated Universal Time)
         </footer>
     </div>
 </div>
index 3ee7412d063a2984a401f4c9a15d88d5912269b9..0e4e2d72568bf21122a8e68279d43af89dbbbb1c 100644 (file)
@@ -86,6 +86,8 @@
             
                 <li data-name="LuCI#hasViewPermission"><a href="LuCI.html#hasViewPermission">hasViewPermission</a></li>
             
+                <li data-name="LuCI#isArguments"><a href="LuCI.html#isArguments">isArguments</a></li>
+            
                 <li data-name="LuCI#isObject"><a href="LuCI.html#isObject">isObject</a></li>
             
                 <li data-name="LuCI#location"><a href="LuCI.html#location">location</a></li>
@@ -3670,7 +3672,7 @@ external JavaScript, use <code>L.require(&quot;ui&quot;).then(...)</code> and ac
     
         
         <div class="tag-source">
-            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line2679">line 2679</a>
+            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line2705">line 2705</a>
         </div>
         
     </div>
@@ -3967,7 +3969,7 @@ upload control.</p></td>
     
         
         <div class="tag-source">
-            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line3173">line 3173</a>
+            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line3199">line 3199</a>
         </div>
         
     </div>
@@ -4458,7 +4460,7 @@ registered.</p></td>
     
         
         <div class="tag-source">
-            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line2773">line 2773</a>
+            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line2799">line 2799</a>
         </div>
         
     </div>
@@ -4561,7 +4563,7 @@ widget markup.</td>
     
         
         <div class="tag-source">
-            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line285">line 285</a>
+            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line284">line 284</a>
         </div>
         
     </div>
@@ -5002,7 +5004,7 @@ trigger input value validation.</p>
     
         
         <div class="tag-source">
-            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line3178">line 3178</a>
+            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line3204">line 3204</a>
         </div>
         
     </div>
@@ -5530,7 +5532,7 @@ ACL setup for the current session.</p></td>
         
 
         <footer>
-            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Thu Dec 19 2024 19:20:36 GMT+0000 (Coordinated Universal Time)
+            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Fri Dec 20 2024 00:14:55 GMT+0000 (Coordinated Universal Time)
         </footer>
     </div>
 </div>
index 6ec2678c97cb6af3ee21a1a6c212a8572b776742..0e951be9f61b77d72b81afe8581b86d5d67ea24f 100644 (file)
@@ -86,6 +86,8 @@
             
                 <li data-name="LuCI#hasViewPermission"><a href="LuCI.html#hasViewPermission">hasViewPermission</a></li>
             
+                <li data-name="LuCI#isArguments"><a href="LuCI.html#isArguments">isArguments</a></li>
+            
                 <li data-name="LuCI#isObject"><a href="LuCI.html#isObject">isObject</a></li>
             
                 <li data-name="LuCI#location"><a href="LuCI.html#location">location</a></li>
@@ -3670,7 +3672,7 @@ external JavaScript, use <code>L.require(&quot;ui&quot;).then(...)</code> and ac
     
         
         <div class="tag-source">
-            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line2613">line 2613</a>
+            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line2639">line 2639</a>
         </div>
         
     </div>
@@ -3966,7 +3968,7 @@ external JavaScript, use <code>L.require(&quot;ui&quot;).then(...)</code> and ac
     
         
         <div class="tag-source">
-            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line2669">line 2669</a>
+            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line2695">line 2695</a>
         </div>
         
     </div>
@@ -4457,7 +4459,7 @@ registered.</p></td>
     
         
         <div class="tag-source">
-            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line2649">line 2649</a>
+            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line2675">line 2675</a>
         </div>
         
     </div>
@@ -4560,7 +4562,7 @@ widget markup.</td>
     
         
         <div class="tag-source">
-            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line285">line 285</a>
+            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line284">line 284</a>
         </div>
         
     </div>
@@ -5001,7 +5003,7 @@ trigger input value validation.</p>
     
         
         <div class="tag-source">
-            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line2674">line 2674</a>
+            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line2700">line 2700</a>
         </div>
         
     </div>
@@ -5210,7 +5212,7 @@ trigger validation runs, e.g. when programmatically altering values.</p>
         
 
         <footer>
-            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Thu Dec 19 2024 19:20:36 GMT+0000 (Coordinated Universal Time)
+            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Fri Dec 20 2024 00:14:55 GMT+0000 (Coordinated Universal Time)
         </footer>
     </div>
 </div>
index 1f0b4ef8288d6a56c38fc0d9effda7e1a04a2160..2c380c67657c7e40e33da25f68bfb31ed82141f8 100644 (file)
@@ -86,6 +86,8 @@
             
                 <li data-name="LuCI#hasViewPermission"><a href="LuCI.html#hasViewPermission">hasViewPermission</a></li>
             
+                <li data-name="LuCI#isArguments"><a href="LuCI.html#isArguments">isArguments</a></li>
+            
                 <li data-name="LuCI#isObject"><a href="LuCI.html#isObject">isObject</a></li>
             
                 <li data-name="LuCI#location"><a href="LuCI.html#location">location</a></li>
@@ -3671,7 +3673,7 @@ external JavaScript, use <code>L.require(&quot;ui&quot;).then(...)</code> and ac
     
         
         <div class="tag-source">
-            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line685">line 685</a>
+            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line683">line 683</a>
         </div>
         
     </div>
@@ -4001,7 +4003,7 @@ choice labels.</p></td>
     
         
         <div class="tag-source">
-            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line864">line 864</a>
+            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line862">line 862</a>
         </div>
         
     </div>
@@ -4492,7 +4494,7 @@ registered.</p></td>
     
         
         <div class="tag-source">
-            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line776">line 776</a>
+            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line774">line 774</a>
         </div>
         
     </div>
@@ -4595,7 +4597,7 @@ widget markup.</td>
     
         
         <div class="tag-source">
-            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line285">line 285</a>
+            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line284">line 284</a>
         </div>
         
     </div>
@@ -5036,7 +5038,7 @@ trigger input value validation.</p>
     
         
         <div class="tag-source">
-            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line877">line 877</a>
+            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line875">line 875</a>
         </div>
         
     </div>
@@ -5562,7 +5564,7 @@ selected yet. Only applicable to the <code>select</code> widget type.</p></td>
         
 
         <footer>
-            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Thu Dec 19 2024 19:20:36 GMT+0000 (Coordinated Universal Time)
+            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Fri Dec 20 2024 00:14:56 GMT+0000 (Coordinated Universal Time)
         </footer>
     </div>
 </div>
index a7661870ed55aee4c9e2b69a04f9dda06f591f03..45e1cdf0a3744d57347bdb3824dba3d01adbd2d8 100644 (file)
@@ -86,6 +86,8 @@
             
                 <li data-name="LuCI#hasViewPermission"><a href="LuCI.html#hasViewPermission">hasViewPermission</a></li>
             
+                <li data-name="LuCI#isArguments"><a href="LuCI.html#isArguments">isArguments</a></li>
+            
                 <li data-name="LuCI#isObject"><a href="LuCI.html#isObject">isObject</a></li>
             
                 <li data-name="LuCI#location"><a href="LuCI.html#location">location</a></li>
@@ -3669,7 +3671,7 @@ external JavaScript, use <code>L.require(&quot;ui&quot;).then(...)</code> and ac
     
         
         <div class="tag-source">
-            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line432">line 432</a>
+            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line430">line 430</a>
         </div>
         
     </div>
@@ -3962,7 +3964,7 @@ external JavaScript, use <code>L.require(&quot;ui&quot;).then(...)</code> and ac
     
         
         <div class="tag-source">
-            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line538">line 538</a>
+            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line536">line 536</a>
         </div>
         
     </div>
@@ -4453,7 +4455,7 @@ registered.</p></td>
     
         
         <div class="tag-source">
-            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line499">line 499</a>
+            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line497">line 497</a>
         </div>
         
     </div>
@@ -4556,7 +4558,7 @@ widget markup.</td>
     
         
         <div class="tag-source">
-            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line285">line 285</a>
+            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line284">line 284</a>
         </div>
         
     </div>
@@ -4997,7 +4999,7 @@ trigger input value validation.</p>
     
         
         <div class="tag-source">
-            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line543">line 543</a>
+            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line541">line 541</a>
         </div>
         
     </div>
@@ -5508,7 +5510,7 @@ contents.</p></td>
         
 
         <footer>
-            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Thu Dec 19 2024 19:20:36 GMT+0000 (Coordinated Universal Time)
+            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Fri Dec 20 2024 00:14:56 GMT+0000 (Coordinated Universal Time)
         </footer>
     </div>
 </div>
index 0b3c2a87d7cd848f65d95e79766352dd86cf8378..ac7b41c432083beb9823a4f910f93e40ec074c00 100644 (file)
@@ -86,6 +86,8 @@
             
                 <li data-name="LuCI#hasViewPermission"><a href="LuCI.html#hasViewPermission">hasViewPermission</a></li>
             
+                <li data-name="LuCI#isArguments"><a href="LuCI.html#isArguments">isArguments</a></li>
+            
                 <li data-name="LuCI#isObject"><a href="LuCI.html#isObject">isObject</a></li>
             
                 <li data-name="LuCI#location"><a href="LuCI.html#location">location</a></li>
@@ -3669,7 +3671,7 @@ external JavaScript, use <code>L.require(&quot;ui&quot;).then(...)</code> and ac
     
         
         <div class="tag-source">
-            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line307">line 307</a>
+            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line306">line 306</a>
         </div>
         
     </div>
@@ -3962,7 +3964,7 @@ external JavaScript, use <code>L.require(&quot;ui&quot;).then(...)</code> and ac
     
         
         <div class="tag-source">
-            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line420">line 420</a>
+            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line418">line 418</a>
         </div>
         
     </div>
@@ -4453,7 +4455,7 @@ registered.</p></td>
     
         
         <div class="tag-source">
-            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line366">line 366</a>
+            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line365">line 365</a>
         </div>
         
     </div>
@@ -4556,7 +4558,7 @@ widget markup.</td>
     
         
         <div class="tag-source">
-            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line285">line 285</a>
+            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line284">line 284</a>
         </div>
         
     </div>
@@ -4997,7 +4999,7 @@ trigger input value validation.</p>
     
         
         <div class="tag-source">
-            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line426">line 426</a>
+            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line424">line 424</a>
         </div>
         
     </div>
@@ -5436,7 +5438,7 @@ corresponding <code>&lt;input&gt;</code> element is empty.</p></td>
         
 
         <footer>
-            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Thu Dec 19 2024 19:20:36 GMT+0000 (Coordinated Universal Time)
+            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Fri Dec 20 2024 00:14:56 GMT+0000 (Coordinated Universal Time)
         </footer>
     </div>
 </div>
index d078d5d680f184e49ffba787d360d53b45a84fa4..f61b72d5c1c87aa800ed028bddd8b3cf609b0391 100644 (file)
@@ -86,6 +86,8 @@
             
                 <li data-name="LuCI#hasViewPermission"><a href="LuCI.html#hasViewPermission">hasViewPermission</a></li>
             
+                <li data-name="LuCI#isArguments"><a href="LuCI.html#isArguments">isArguments</a></li>
+            
                 <li data-name="LuCI#isObject"><a href="LuCI.html#isObject">isObject</a></li>
             
                 <li data-name="LuCI#location"><a href="LuCI.html#location">location</a></li>
@@ -3667,7 +3669,7 @@ external JavaScript, use <code>L.require(&quot;ui&quot;).then(...)</code> and ac
     
         
         <div class="tag-source">
-            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line4511">line 4511</a>
+            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line4549">line 4549</a>
         </div>
         
     </div>
@@ -3752,7 +3754,7 @@ external JavaScript, use <code>L.require(&quot;ui&quot;).then(...)</code> and ac
     
         
         <div class="tag-source">
-            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line4843">line 4843</a>
+            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line4879">line 4879</a>
         </div>
         
     </div>
@@ -3893,7 +3895,7 @@ settings.</p></td>
     
         
         <div class="tag-source">
-            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line4588">line 4588</a>
+            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line4626">line 4626</a>
         </div>
         
     </div>
@@ -3966,7 +3968,7 @@ and offer options to revert or apply the shown changes.</p>
     
         
         <div class="tag-source">
-            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line4554">line 4554</a>
+            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line4592">line 4592</a>
         </div>
         
     </div>
@@ -4084,7 +4086,7 @@ UCI changeset structure.</p>
     
         
         <div class="tag-source">
-            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line4919">line 4919</a>
+            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line4955">line 4955</a>
         </div>
         
     </div>
@@ -4160,7 +4162,7 @@ complete.</p>
     
         
         <div class="tag-source">
-            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line4532">line 4532</a>
+            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line4570">line 4570</a>
         </div>
         
     </div>
@@ -4288,7 +4290,7 @@ is removed.</p>
         
 
         <footer>
-            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Thu Dec 19 2024 19:20:36 GMT+0000 (Coordinated Universal Time)
+            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Fri Dec 20 2024 00:14:55 GMT+0000 (Coordinated Universal Time)
         </footer>
     </div>
 </div>
index fbe8963de26f5462771568171009999e640f38ce..ce7b5a2e2278d6f046153d17ac9a37f32b1998fc 100644 (file)
@@ -86,6 +86,8 @@
             
                 <li data-name="LuCI#hasViewPermission"><a href="LuCI.html#hasViewPermission">hasViewPermission</a></li>
             
+                <li data-name="LuCI#isArguments"><a href="LuCI.html#isArguments">isArguments</a></li>
+            
                 <li data-name="LuCI#isObject"><a href="LuCI.html#isObject">isObject</a></li>
             
                 <li data-name="LuCI#location"><a href="LuCI.html#location">location</a></li>
@@ -3664,7 +3666,7 @@ external JavaScript, use <code>L.require(&quot;ui&quot;).then(...)</code>.</p></
     
         
         <div class="tag-source">
-            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line3618">line 3618</a>
+            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line3649">line 3649</a>
         </div>
         
     </div>
@@ -3795,7 +3797,7 @@ external JavaScript, use <code>L.require(&quot;ui&quot;).then(...)</code>.</p></
     
         
         <div class="tag-source">
-            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line3834">line 3834</a>
+            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line3863">line 3863</a>
         </div>
         
     </div>
@@ -4057,7 +4059,7 @@ banner element.</p></td>
     
         
         <div class="tag-source">
-            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line4987">line 4987</a>
+            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line5023">line 5023</a>
         </div>
         
     </div>
@@ -4371,7 +4373,7 @@ trigger field validation or to bind it to further events.</td>
     
         
         <div class="tag-source">
-            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line4475">line 4475</a>
+            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line4512">line 4512</a>
         </div>
         
     </div>
@@ -4508,7 +4510,7 @@ default.</p></td>
     
         
         <div class="tag-source">
-            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line5038">line 5038</a>
+            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line5073">line 5073</a>
         </div>
         
     </div>
@@ -4734,7 +4736,7 @@ valid function value.</td>
     
         
         <div class="tag-source">
-            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line3974">line 3974</a>
+            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line4003">line 4003</a>
         </div>
         
     </div>
@@ -4882,7 +4884,7 @@ requested indicator was not found.</td>
     
         
         <div class="tag-source">
-            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line3720">line 3720</a>
+            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line3749">line 3749</a>
         </div>
         
     </div>
@@ -4958,7 +4960,7 @@ handler as-is without the need to bind it first.</p>
     
         
         <div class="tag-source">
-            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line5081">line 5081</a>
+            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line5114">line 5114</a>
         </div>
         
     </div>
@@ -5110,7 +5112,7 @@ caught and rendered using <a href="LuCI.html#error"><code>LuCI.error()</code></a
     
         
         <div class="tag-source">
-            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line4017">line 4017</a>
+            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line4046">line 4046</a>
         </div>
         
     </div>
@@ -5352,7 +5354,7 @@ accepted by <code>LuCI.dom.content()</code>.</p></td>
     
         
         <div class="tag-source">
-            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line4449">line 4449</a>
+            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line4486">line 4486</a>
         </div>
         
     </div>
@@ -5555,7 +5557,7 @@ or rejecting with <code>null</code> when the connectivity check timed out.</td>
     
         
         <div class="tag-source">
-            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line3926">line 3926</a>
+            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line3955">line 3955</a>
         </div>
         
     </div>
@@ -5829,7 +5831,7 @@ changes were made.</td>
     
         
         <div class="tag-source">
-            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line3692">line 3692</a>
+            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line3723">line 3723</a>
         </div>
         
     </div>
@@ -6058,7 +6060,7 @@ element.</p></td>
     
         
         <div class="tag-source">
-            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line4332">line 4332</a>
+            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line4364">line 4364</a>
         </div>
         
     </div>
@@ -6416,7 +6418,7 @@ cancelled by the user.</td>
         
 
         <footer>
-            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Thu Dec 19 2024 19:20:36 GMT+0000 (Coordinated Universal Time)
+            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Fri Dec 20 2024 00:14:55 GMT+0000 (Coordinated Universal Time)
         </footer>
     </div>
 </div>
index 66840d74774500d839d09a490a3482edbe553231..b7ae801f6592e674cd24d1f8b746af8ca60ad049 100644 (file)
@@ -86,6 +86,8 @@
             
                 <li data-name="LuCI#hasViewPermission"><a href="LuCI.html#hasViewPermission">hasViewPermission</a></li>
             
+                <li data-name="LuCI#isArguments"><a href="LuCI.html#isArguments">isArguments</a></li>
+            
                 <li data-name="LuCI#isObject"><a href="LuCI.html#isObject">isObject</a></li>
             
                 <li data-name="LuCI#location"><a href="LuCI.html#location">location</a></li>
     
         
         <div class="tag-source">
-            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line3204">line 3204</a>
+            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line3230">line 3230</a>
         </div>
         
     </div>
     
         
         <div class="tag-source">
-            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line3253">line 3253</a>
+            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line3279">line 3279</a>
         </div>
         
     </div>
@@ -3823,7 +3825,7 @@ next page load.</p>
     
         
         <div class="tag-source">
-            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line3265">line 3265</a>
+            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line3291">line 3291</a>
         </div>
         
     </div>
@@ -3972,7 +3974,7 @@ internal root node if omitted.</p></td>
     
         
         <div class="tag-source">
-            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line3233">line 3233</a>
+            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line3259">line 3259</a>
         </div>
         
     </div>
@@ -4335,7 +4337,7 @@ internal root node if omitted.</p></td>
         
 
         <footer>
-            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Thu Dec 19 2024 19:20:36 GMT+0000 (Coordinated Universal Time)
+            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Fri Dec 20 2024 00:14:55 GMT+0000 (Coordinated Universal Time)
         </footer>
     </div>
 </div>
index 833d507362297a0d895ffccbf786e87b4bd76541..59f08869a08c8a4b59c4f9305dbe287a81fb1be7 100644 (file)
@@ -86,6 +86,8 @@
             
                 <li data-name="LuCI#hasViewPermission"><a href="LuCI.html#hasViewPermission">hasViewPermission</a></li>
             
+                <li data-name="LuCI#isArguments"><a href="LuCI.html#isArguments">isArguments</a></li>
+            
                 <li data-name="LuCI#isObject"><a href="LuCI.html#isObject">isObject</a></li>
             
                 <li data-name="LuCI#location"><a href="LuCI.html#location">location</a></li>
@@ -3668,7 +3670,7 @@ external JavaScript, use <code>L.require(&quot;ui&quot;).then(...)</code> and ac
     
         
         <div class="tag-source">
-            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line4058">line 4058</a>
+            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line4087">line 4087</a>
         </div>
         
     </div>
@@ -3753,7 +3755,7 @@ external JavaScript, use <code>L.require(&quot;ui&quot;).then(...)</code> and ac
     
         
         <div class="tag-source">
-            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line4113">line 4113</a>
+            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line4144">line 4144</a>
         </div>
         
     </div>
@@ -3882,7 +3884,7 @@ DOM node.</p></td>
     
         
         <div class="tag-source">
-            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line4185">line 4185</a>
+            <a href="ui.js.html">ui.js</a>, <a href="ui.js.html#line4216">line 4216</a>
         </div>
         
     </div>
@@ -4035,7 +4037,7 @@ DOM node.</p></td>
         
 
         <footer>
-            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Thu Dec 19 2024 19:20:36 GMT+0000 (Coordinated Universal Time)
+            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Fri Dec 20 2024 00:14:56 GMT+0000 (Coordinated Universal Time)
         </footer>
     </div>
 </div>
index e88bae48981b610c2a6f21a905bbc891ddf0e49d..da7d39e7ae3682f039a9f89c8116dcffb33f831f 100644 (file)
@@ -86,6 +86,8 @@
             
                 <li data-name="LuCI#hasViewPermission"><a href="LuCI.html#hasViewPermission">hasViewPermission</a></li>
             
+                <li data-name="LuCI#isArguments"><a href="LuCI.html#isArguments">isArguments</a></li>
+            
                 <li data-name="LuCI#isObject"><a href="LuCI.html#isObject">isObject</a></li>
             
                 <li data-name="LuCI#location"><a href="LuCI.html#location">location</a></li>
@@ -3663,7 +3665,7 @@ set of methods to inherit from.</p></div>
     
         
         <div class="tag-source">
-            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line1927">line 1927</a>
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line1877">line 1877</a>
         </div>
         
     </div>
@@ -3748,7 +3750,7 @@ set of methods to inherit from.</p></div>
     
         
         <div class="tag-source">
-            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line2154">line 2154</a>
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line2104">line 2104</a>
         </div>
         
     </div>
@@ -3861,7 +3863,7 @@ methods are overwritten with <code>null</code>.</td>
     
         
         <div class="tag-source">
-            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line2120">line 2120</a>
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line2070">line 2070</a>
         </div>
         
     </div>
@@ -4025,7 +4027,7 @@ is re-enabled.</td>
     
         
         <div class="tag-source">
-            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line2039">line 2039</a>
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line1989">line 1989</a>
         </div>
         
     </div>
@@ -4189,7 +4191,7 @@ is re-enabled.</td>
     
         
         <div class="tag-source">
-            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line2083">line 2083</a>
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line2033">line 2033</a>
         </div>
         
     </div>
@@ -4355,7 +4357,7 @@ is re-enabled.</td>
     
         
         <div class="tag-source">
-            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line1974">line 1974</a>
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line1924">line 1924</a>
         </div>
         
     </div>
@@ -4465,7 +4467,7 @@ the default implementation does nothing.</p>
     
         
         <div class="tag-source">
-            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line2006">line 2006</a>
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line1956">line 1956</a>
         </div>
         
     </div>
@@ -4639,7 +4641,7 @@ to a <code>Node</code> value.</td>
         
 
         <footer>
-            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Thu Dec 19 2024 19:20:36 GMT+0000 (Coordinated Universal Time)
+            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Fri Dec 20 2024 00:14:56 GMT+0000 (Coordinated Universal Time)
         </footer>
     </div>
 </div>
index 13473c180f74687a0c27e2497ed9ea87f1b2e321..a06f13d60c67d3d737578d00f8e6aef6ad7a729f 100644 (file)
@@ -86,6 +86,8 @@
             
                 <li data-name="LuCI#hasViewPermission"><a href="LuCI.html#hasViewPermission">hasViewPermission</a></li>
             
+                <li data-name="LuCI#isArguments"><a href="LuCI.html#isArguments">isArguments</a></li>
+            
                 <li data-name="LuCI#isObject"><a href="LuCI.html#isObject">isObject</a></li>
             
                 <li data-name="LuCI#location"><a href="LuCI.html#location">location</a></li>
@@ -3666,7 +3668,7 @@ request handling.</p></div>
     
         
         <div class="tag-source">
-            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line3326">line 3326</a>
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line3275">line 3275</a>
         </div>
         
     </div>
@@ -3753,7 +3755,7 @@ request handling.</p></div>
     
         
         <div class="tag-source">
-            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line3442">line 3442</a>
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line3391">line 3391</a>
         </div>
         
     </div>
@@ -3827,7 +3829,7 @@ request handling.</p></div>
     
         
         <div class="tag-source">
-            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line3431">line 3431</a>
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line3380">line 3380</a>
         </div>
         
     </div>
@@ -3930,7 +3932,7 @@ already completed.</td>
     
         
         <div class="tag-source">
-            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line3418">line 3418</a>
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line3367">line 3367</a>
         </div>
         
     </div>
@@ -4007,7 +4009,7 @@ finishes or timed out.</p>
     
         
         <div class="tag-source">
-            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line3374">line 3374</a>
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line3323">line 3323</a>
         </div>
         
     </div>
@@ -4250,7 +4252,7 @@ finishes or timed out.</p>
     
         
         <div class="tag-source">
-            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line3401">line 3401</a>
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line3350">line 3350</a>
         </div>
         
     </div>
@@ -4493,7 +4495,7 @@ finishes or timed out.</p>
     
         
         <div class="tag-source">
-            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line3457">line 3457</a>
+            <a href="luci.js.html">luci.js</a>, <a href="luci.js.html#line3406">line 3406</a>
         </div>
         
     </div>
@@ -4603,7 +4605,7 @@ when invoked.</p>
         
 
         <footer>
-            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Thu Dec 19 2024 19:20:36 GMT+0000 (Coordinated Universal Time)
+            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Fri Dec 20 2024 00:14:56 GMT+0000 (Coordinated Universal Time)
         </footer>
     </div>
 </div>
index 51d48751390162ff2fb36581cbb1b16d04d54ffb..f18856c0e3e85660a6822ff2e23bb1e2d62c1c51 100644 (file)
@@ -86,6 +86,8 @@
             
                 <li data-name="LuCI#hasViewPermission"><a href="LuCI.html#hasViewPermission">hasViewPermission</a></li>
             
+                <li data-name="LuCI#isArguments"><a href="LuCI.html#isArguments">isArguments</a></li>
+            
                 <li data-name="LuCI#isObject"><a href="LuCI.html#isObject">isObject</a></li>
             
                 <li data-name="LuCI#location"><a href="LuCI.html#location">location</a></li>
 'require dom';
 'require baseclass';
 
-var scope = this;
+const scope = this;
 
-var callSessionAccess = rpc.declare({
+const callSessionAccess = rpc.declare({
        object: 'session',
        method: 'access',
        params: [ 'scope', 'object', 'function' ],
        expect: { 'access': false }
 });
 
-var CBIJSONConfig = baseclass.extend({
-       __init__: function(data) {
+const CBIJSONConfig = baseclass.extend({
+       __init__(data) {
                data = Object.assign({}, data);
 
                this.data = {};
 
-               var num_sections = 0,
-                   section_ids = [];
+               let num_sections = 0;
+               const section_ids = [];
 
-               for (var sectiontype in data) {
+               for (const sectiontype in data) {
                        if (!data.hasOwnProperty(sectiontype))
                                continue;
 
                        if (Array.isArray(data[sectiontype])) {
-                               for (var i = 0, index = 0; i &lt; data[sectiontype].length; i++) {
-                                       var item = data[sectiontype][i],
-                                           anonymous, name;
+                               for (let i = 0, index = 0; i &lt; data[sectiontype].length; i++) {
+                                       const item = data[sectiontype][i];
+                                       let anonymous;
+                                       let name;
 
                                        if (!L.isObject(item))
                                                continue;
@@ -3705,9 +3708,9 @@ var CBIJSONConfig = baseclass.extend({
                        }
                }
 
-               section_ids.sort(L.bind(function(a, b) {
-                       var indexA = (this.data[a]['.index'] != null) ? +this.data[a]['.index'] : 9999,
-                           indexB = (this.data[b]['.index'] != null) ? +this.data[b]['.index'] : 9999;
+               section_ids.sort(L.bind((a, b) => {
+                       const indexA = (this.data[a]['.index'] != null) ? +this.data[a]['.index'] : 9999;
+                       const indexB = (this.data[b]['.index'] != null) ? +this.data[b]['.index'] : 9999;
 
                        if (indexA != indexB)
                                return (indexA - indexB);
@@ -3715,19 +3718,19 @@ var CBIJSONConfig = baseclass.extend({
                        return L.naturalCompare(a, b);
                }, this));
 
-               for (var i = 0; i &lt; section_ids.length; i++)
+               for (let i = 0; i &lt; section_ids.length; i++)
                        this.data[section_ids[i]]['.index'] = i;
        },
 
-       load: function() {
+       load() {
                return Promise.resolve(this.data);
        },
 
-       save: function() {
+       save() {
                return Promise.resolve();
        },
 
-       get: function(config, section, option) {
+       get(config, section, option) {
                if (section == null)
                        return null;
 
@@ -3737,7 +3740,7 @@ var CBIJSONConfig = baseclass.extend({
                if (!this.data.hasOwnProperty(section))
                        return null;
 
-               var value = this.data[section][option];
+               const value = this.data[section][option];
 
                if (Array.isArray(value))
                        return value;
@@ -3748,7 +3751,7 @@ var CBIJSONConfig = baseclass.extend({
                return null;
        },
 
-       set: function(config, section, option, value) {
+       set(config, section, option, value) {
                if (section == null || option == null || option.charAt(0) == '.')
                        return;
 
@@ -3763,35 +3766,36 @@ var CBIJSONConfig = baseclass.extend({
                        this.data[section][option] = String(value);
        },
 
-       unset: function(config, section, option) {
+       unset(config, section, option) {
                return this.set(config, section, option, null);
        },
 
-       sections: function(config, sectiontype, callback) {
-               var rv = [];
+       sections(config, sectiontype, callback) {
+               const rv = [];
 
-               for (var section_id in this.data)
+               for (const section_id in this.data)
                        if (sectiontype == null || this.data[section_id]['.type'] == sectiontype)
                                rv.push(this.data[section_id]);
 
-               rv.sort(function(a, b) { return a['.index'] - b['.index'] });
+               rv.sort((a, b) => { return a['.index'] - b['.index'] });
 
                if (typeof(callback) == 'function')
-                       for (var i = 0; i &lt; rv.length; i++)
+                       for (let i = 0; i &lt; rv.length; i++)
                                callback.call(this, rv[i], rv[i]['.name']);
 
                return rv;
        },
 
-       add: function(config, sectiontype, sectionname) {
-               var num_sections_type = 0, next_index = 0;
+       add(config, sectiontype, sectionname) {
+               let num_sections_type = 0;
+               let next_index = 0;
 
-               for (var name in this.data) {
+               for (const name in this.data) {
                        num_sections_type += (this.data[name]['.type'] == sectiontype);
                        next_index = Math.max(next_index, this.data[name]['.index']);
                }
 
-               var section_id = sectionname || sectiontype + num_sections_type;
+               const section_id = sectionname ?? (sectiontype + num_sections_type);
 
                if (!this.data.hasOwnProperty(section_id)) {
                        this.data[section_id] = {
@@ -3805,16 +3809,16 @@ var CBIJSONConfig = baseclass.extend({
                return section_id;
        },
 
-       remove: function(config, section) {
+       remove(config, section) {
                if (this.data.hasOwnProperty(section))
                        delete this.data[section];
        },
 
-       resolveSID: function(config, section_id) {
+       resolveSID(config, section_id) {
                return section_id;
        },
 
-       move: function(config, section_id1, section_id2, after) {
+       move(config, section_id1, section_id2, after) {
                return uci.move.apply(this, [config, section_id1, section_id2, after]);
        }
 });
@@ -3832,10 +3836,10 @@ var CBIJSONConfig = baseclass.extend({
  *
  * This class is private and not directly accessible by user code.
  */
-var CBIAbstractElement = baseclass.extend(/** @lends LuCI.form.AbstractElement.prototype */ {
-       __init__: function(title, description) {
-               this.title = title || '';
-               this.description = description || '';
+const CBIAbstractElement = baseclass.extend(/** @lends LuCI.form.AbstractElement.prototype */ {
+       __init__(title, description) {
+               this.title = title ?? '';
+               this.description = description ?? '';
                this.children = [];
        },
 
@@ -3845,7 +3849,7 @@ var CBIAbstractElement = baseclass.extend(/** @lends LuCI.form.AbstractElement.p
         * @param {AbstractElement} obj
         * The form element to add.
         */
-       append: function(obj) {
+       append(obj) {
                this.children.push(obj);
        },
 
@@ -3863,10 +3867,10 @@ var CBIAbstractElement = baseclass.extend(/** @lends LuCI.form.AbstractElement.p
         * if any parsed values are not meeting the validation constraints of their
         * respective elements.
         */
-       parse: function() {
-               var args = arguments;
-               this.children.forEach(function(child) {
-                       child.parse.apply(child, args);
+       parse() {
+               const args = arguments;
+               this.children.forEach((child) => {
+                       child.parse(...args);
                });
        },
 
@@ -3881,33 +3885,32 @@ var CBIAbstractElement = baseclass.extend(/** @lends LuCI.form.AbstractElement.p
         * May return a DOM Node or a promise resolving to a DOM node containing
         * the form element's markup, including the markup of any child elements.
         */
-       render: function() {
+       render() {
                L.error('InternalError', 'Not implemented');
        },
 
        /** @private */
-       loadChildren: function(/* ... */) {
-               var tasks = [];
+       loadChildren(...args) /* ... */{
+               const tasks = [];
 
                if (Array.isArray(this.children))
-                       for (var i = 0; i &lt; this.children.length; i++)
+                       for (let i = 0; i &lt; this.children.length; i++)
                                if (!this.children[i].disable)
-                                       tasks.push(this.children[i].load.apply(this.children[i], arguments));
+                                       tasks.push(this.children[i].load(...args));
 
                return Promise.all(tasks);
        },
 
        /** @private */
-       renderChildren: function(tab_name /*, ... */) {
-               var tasks = [],
-                   index = 0;
+       renderChildren(tab_name, ...args) {
+               const tasks = [];
+               let index = 0;
 
                if (Array.isArray(this.children))
-                       for (var i = 0; i &lt; this.children.length; i++)
+                       for (let i = 0; i &lt; this.children.length; i++)
                                if (tab_name === null || this.children[i].tab === tab_name)
                                        if (!this.children[i].disable)
-                                               tasks.push(this.children[i].render.apply(
-                                                       this.children[i], this.varargs(arguments, 1, index++)));
+                                               tasks.push(this.children[i].render(index++, ...args));
 
                return Promise.all(tasks);
        },
@@ -3923,17 +3926,17 @@ var CBIAbstractElement = baseclass.extend(/** @lends LuCI.form.AbstractElement.p
         * The cleaned input string with HTML tags removed, and HTML
         * entities decoded.
         */
-       stripTags: function(s) {
+       stripTags(s) {
                if (typeof(s) == 'string' &amp;&amp; !s.match(/[&lt;>\&amp;]/))
                        return s;
 
-               var x = dom.elem(s) ? s : dom.parse('&lt;div>' + s + '&lt;/div>');
+               const x = dom.elem(s) ? s : dom.parse(`&lt;div>${s}&lt;/div>`);
 
-               x.querySelectorAll('br').forEach(function(br) {
+               x.querySelectorAll('br').forEach((br) => {
                        x.replaceChild(document.createTextNode('\n'), br);
                });
 
-               return (x.textContent || x.innerText || '').replace(/([ \t]*\n)+/g, '\n');
+               return (x.textContent ?? x.innerText ?? '').replace(/([ \t]*\n)+/g, '\n');
        },
 
        /**
@@ -3962,13 +3965,13 @@ var CBIAbstractElement = baseclass.extend(/** @lends LuCI.form.AbstractElement.p
         * The formatted title string or `null` if the property did not exist or
         * was neither a string nor a function.
         */
-       titleFn: function(attr /*, ... */) {
-               var s = null;
+       titleFn(attr, ...args) {
+               let s = null;
 
                if (typeof(this[attr]) == 'function')
-                       s = this[attr].apply(this, this.varargs(arguments, 1));
+                       s = this[attr](...args);
                else if (typeof(this[attr]) == 'string')
-                       s = (arguments.length > 1) ? ''.format.apply(this[attr], this.varargs(arguments, 1)) : this[attr];
+                       s = args.length ? this[attr].format(...args) : this[attr];
 
                if (s != null)
                        s = this.stripTags(String(s)).trim();
@@ -4007,9 +4010,9 @@ var CBIAbstractElement = baseclass.extend(/** @lends LuCI.form.AbstractElement.p
  * paragraph below the form title and before the actual form contents.
  * If omitted, the corresponding paragraph element will not be rendered.
  */
-var CBIMap = CBIAbstractElement.extend(/** @lends LuCI.form.Map.prototype */ {
-       __init__: function(config /*, ... */) {
-               this.super('__init__', this.varargs(arguments, 1));
+const CBIMap = CBIAbstractElement.extend(/** @lends LuCI.form.Map.prototype */ {
+       __init__(config, ...args) {
+               this.super('__init__', args);
 
                this.config = config;
                this.parsechain = [ config ];
@@ -4060,13 +4063,13 @@ var CBIMap = CBIAbstractElement.extend(/** @lends LuCI.form.Map.prototype */ {
         * @returns {NodeList}
         * Returns a (possibly empty) DOM `NodeList` containing the found DOM nodes.
         */
-       findElements: function(/* ... */) {
-               var q = null;
+       findElements(...args) /* ... */{
+               let q = null;
 
-               if (arguments.length == 1)
-                       q = arguments[0];
-               else if (arguments.length == 2)
-                       q = '[%s="%s"]'.format(arguments[0], arguments[1]);
+               if (args.length == 1)
+                       q = args[0];
+               else if (args.length == 2)
+                       q = '[%s="%s"]'.format(args[0], args[1]);
                else
                        L.error('InternalError', 'Expecting one or two arguments to findElements()');
 
@@ -4103,8 +4106,8 @@ var CBIMap = CBIAbstractElement.extend(/** @lends LuCI.form.Map.prototype */ {
         * @returns {Node|null}
         * Returns the first found DOM node or `null` if no element matched.
         */
-       findElement: function(/* ... */) {
-               var res = this.findElements.apply(this, arguments);
+       findElement(...args) /* ... */{
+               const res = this.findElements(...args);
                return res.length ? res[0] : null;
        },
 
@@ -4121,7 +4124,7 @@ var CBIMap = CBIAbstractElement.extend(/** @lends LuCI.form.Map.prototype */ {
         * The additional UCI configuration file to tie to the map. If the given
         * config already is in the list of required files, it will be ignored.
         */
-       chain: function(config) {
+       chain(config) {
                if (this.parsechain.indexOf(config) == -1)
                        this.parsechain.push(config);
        },
@@ -4153,11 +4156,11 @@ var CBIMap = CBIAbstractElement.extend(/** @lends LuCI.form.Map.prototype */ {
         * @returns {LuCI.form.AbstractSection}
         * Returns the instantiated section class instance.
         */
-       section: function(cbiClass /*, ... */) {
+       section(cbiClass, ...args) {
                if (!CBIAbstractSection.isSubclass(cbiClass))
                        L.error('TypeError', 'Class must be a descendent of CBIAbstractSection');
 
-               var obj = cbiClass.instantiate(this.varargs(arguments, 1, this));
+               const obj = cbiClass.instantiate([this, ...args]);
                this.append(obj);
                return obj;
        },
@@ -4175,16 +4178,16 @@ var CBIMap = CBIAbstractElement.extend(/** @lends LuCI.form.Map.prototype */ {
         * to load or if any of the child elements load functions rejected with
         * an error.
         */
-       load: function() {
-               var doCheckACL = (!(this instanceof CBIJSONMap) &amp;&amp; this.readonly == null),
-                   loadTasks = [ doCheckACL ? callSessionAccess('uci', this.config, 'write') : true ],
-                   configs = this.parsechain || [ this.config ];
+       load() {
+               const doCheckACL = (!(this instanceof CBIJSONMap) &amp;&amp; this.readonly == null);
+               const loadTasks = [ doCheckACL ? callSessionAccess('uci', this.config, 'write') : true ];
+               const configs = this.parsechain ?? [ this.config ];
 
-               loadTasks.push.apply(loadTasks, configs.map(L.bind(function(config, i) {
+               loadTasks.push(...configs.map(L.bind((config, i) => {
                        return i ? L.resolveDefault(this.data.load(config)) : this.data.load(config);
                }, this)));
 
-               return Promise.all(loadTasks).then(L.bind(function(res) {
+               return Promise.all(loadTasks).then(L.bind((res) =>  {
                        if (res[0] === false)
                                this.readonly = true;
 
@@ -4205,11 +4208,11 @@ var CBIMap = CBIAbstractElement.extend(/** @lends LuCI.form.Map.prototype */ {
         * input values. The returned promise is rejected if any parsed values are
         * not meeting the validation constraints of their respective elements.
         */
-       parse: function() {
-               var tasks = [];
+       parse() {
+               const tasks = [];
 
                if (Array.isArray(this.children))
-                       for (var i = 0; i &lt; this.children.length; i++)
+                       for (let i = 0; i &lt; this.children.length; i++)
                                tasks.push(this.children[i].parse());
 
                return Promise.all(tasks);
@@ -4235,14 +4238,14 @@ var CBIMap = CBIAbstractElement.extend(/** @lends LuCI.form.Map.prototype */ {
         * The returned promise is rejected if any step of the save operation
         * failed.
         */
-       save: function(cb, silent) {
+       save(cb, silent) {
                this.checkDepends();
 
                return this.parse()
                        .then(cb)
                        .then(this.data.save.bind(this.data))
                        .then(this.load.bind(this))
-                       .catch(function(e) {
+                       .catch((e) =>  {
                                if (!silent) {
                                        ui.showModal(_('Save error'), [
                                                E('p', {}, [ _('An error occurred while saving the form:') ]),
@@ -4265,7 +4268,7 @@ var CBIMap = CBIAbstractElement.extend(/** @lends LuCI.form.Map.prototype */ {
         * Returns a promise resolving to the toplevel form DOM node once the
         * re-rendering is complete.
         */
-       reset: function() {
+       reset() {
                return this.renderContents();
        },
 
@@ -4276,13 +4279,13 @@ var CBIMap = CBIAbstractElement.extend(/** @lends LuCI.form.Map.prototype */ {
         * Returns a promise resolving to the toplevel form DOM node once the
         * rendering is complete.
         */
-       render: function() {
+       render() {
                return this.load().then(this.renderContents.bind(this));
        },
 
        /** @private */
-       renderContents: function() {
-               var mapEl = this.root || (this.root = E('div', {
+       renderContents() {
+               const mapEl = (this.root ??= E('div', {
                        'id': 'cbi-%s'.format(this.config),
                        'class': 'cbi-map',
                        'cbi-dependency-check': L.bind(this.checkDepends, this)
@@ -4290,8 +4293,8 @@ var CBIMap = CBIAbstractElement.extend(/** @lends LuCI.form.Map.prototype */ {
 
                dom.bindClassInstance(mapEl, this);
 
-               return this.renderChildren(null).then(L.bind(function(nodes) {
-                       var initialRender = !mapEl.firstChild;
+               return this.renderChildren(null).then(L.bind((nodes) =>  {
+                       const initialRender = !mapEl.firstChild;
 
                        dom.content(mapEl, null);
 
@@ -4309,16 +4312,16 @@ var CBIMap = CBIAbstractElement.extend(/** @lends LuCI.form.Map.prototype */ {
                        if (!initialRender) {
                                mapEl.classList.remove('flash');
 
-                               window.setTimeout(function() {
+                               window.setTimeout(() =>  {
                                        mapEl.classList.add('flash');
                                }, 1);
                        }
 
                        this.checkDepends();
 
-                       var tabGroups = mapEl.querySelectorAll('.cbi-map-tabbed, .cbi-section-node-tabbed');
+                       const tabGroups = mapEl.querySelectorAll('.cbi-map-tabbed, .cbi-section-node-tabbed');
 
-                       for (var i = 0; i &lt; tabGroups.length; i++)
+                       for (let i = 0; i &lt; tabGroups.length; i++)
                                ui.tabs.initTabGroup(tabGroups[i].childNodes);
 
                        return mapEl;
@@ -4344,13 +4347,16 @@ var CBIMap = CBIAbstractElement.extend(/** @lends LuCI.form.Map.prototype */ {
         * first item and the corresponding UCI section ID as second item.
         * Returns `null` if the option could not be found.
         */
-       lookupOption: function(name, section_id, config_name) {
-               var id, elem, sid, inst;
+       lookupOption(name, section_id, config_name) {
+               let id;
+               let elem;
+               let sid;
+               let inst;
 
                if (name.indexOf('.') > -1)
                        id = 'cbid.%s'.format(name);
                else
-                       id = 'cbid.%s.%s.%s'.format(config_name || this.config, section_id, name);
+                       id = 'cbid.%s.%s.%s'.format(config_name ?? this.config, section_id, name);
 
                elem = this.findElement('data-field', id);
                sid  = elem ? id.split(/\./)[2] : null;
@@ -4360,32 +4366,32 @@ var CBIMap = CBIAbstractElement.extend(/** @lends LuCI.form.Map.prototype */ {
        },
 
        /** @private */
-       checkDepends: function(ev, n) {
-               var changed = false;
+       checkDepends(ev, n) {
+               let changed = false;
 
-               for (var i = 0, s = this.children[0]; (s = this.children[i]) != null; i++)
+               for (let i = 0, s = this.children[0]; (s = this.children[i]) != null; i++)
                        if (s.checkDepends(ev, n))
                                changed = true;
 
-               if (changed &amp;&amp; (n || 0) &lt; 10)
-                       this.checkDepends(ev, (n || 10) + 1);
+               if (changed &amp;&amp; (n ?? 0) &lt; 10)
+                       this.checkDepends(ev, (n ?? 10) + 1);
 
                ui.tabs.updateTabs(ev, this.root);
        },
 
        /** @private */
-       isDependencySatisfied: function(depends, config_name, section_id) {
-               var def = false;
+       isDependencySatisfied(depends, config_name, section_id) {
+               let def = false;
 
                if (!Array.isArray(depends) || !depends.length)
                        return true;
 
-               for (var i = 0; i &lt; depends.length; i++) {
-                       var istat = true,
-                           reverse = depends[i]['!reverse'],
-                           contains = depends[i]['!contains'];
+               for (let i = 0; i &lt; depends.length; i++) {
+                       let istat = true;
+                       const reverse = depends[i]['!reverse'];
+                       const contains = depends[i]['!contains'];
 
-                       for (var dep in depends[i]) {
+                       for (const dep in depends[i]) {
                                if (dep == '!reverse' || dep == '!contains') {
                                        continue;
                                }
@@ -4394,10 +4400,10 @@ var CBIMap = CBIAbstractElement.extend(/** @lends LuCI.form.Map.prototype */ {
                                        istat = false;
                                }
                                else {
-                                       var res = this.lookupOption(dep, section_id, config_name),
-                                           val = (res &amp;&amp; res[0].isActive(res[1])) ? res[0].formvalue(res[1]) : null;
+                                       const res = this.lookupOption(dep, section_id, config_name);
+                                       const val = (res &amp;&amp; res[0].isActive(res[1])) ? res[0].formvalue(res[1]) : null;
 
-                                       var equal = contains
+                                       const equal = contains
                                                ? isContained(val, depends[i][dep])
                                                : isEqual(val, depends[i][dep]);
 
@@ -4440,9 +4446,9 @@ var CBIMap = CBIAbstractElement.extend(/** @lends LuCI.form.Map.prototype */ {
  * paragraph below the form title and before the actual form contents.
  * If omitted, the corresponding paragraph element will not be rendered.
  */
-var CBIJSONMap = CBIMap.extend(/** @lends LuCI.form.JSONMap.prototype */ {
-       __init__: function(data /*, ... */) {
-               this.super('__init__', this.varargs(arguments, 1, 'json'));
+const CBIJSONMap = CBIMap.extend(/** @lends LuCI.form.JSONMap.prototype */ {
+       __init__(data, ...args) {
+               this.super('__init__', [ 'json', ...args ]);
 
                this.config = 'json';
                this.parsechain = [ 'json' ];
@@ -4464,9 +4470,9 @@ var CBIJSONMap = CBIMap.extend(/** @lends LuCI.form.JSONMap.prototype */ {
  *
  * This class is private and not directly accessible by user code.
  */
-var CBIAbstractSection = CBIAbstractElement.extend(/** @lends LuCI.form.AbstractSection.prototype */ {
-       __init__: function(map, sectionType /*, ... */) {
-               this.super('__init__', this.varargs(arguments, 2));
+const CBIAbstractSection = CBIAbstractElement.extend(/** @lends LuCI.form.AbstractSection.prototype */ {
+       __init__(map, sectionType, ...args) {
+               this.super('__init__', args);
 
                this.sectiontype = sectionType;
                this.map = map;
@@ -4501,7 +4507,7 @@ var CBIAbstractSection = CBIAbstractElement.extend(/** @lends LuCI.form.Abstract
         * Returns an array of UCI section IDs covered by this form element.
         * The sections will be rendered in the same order as the returned array.
         */
-       cfgsections: function() {
+       cfgsections() {
                L.error('InternalError', 'Not implemented');
        },
 
@@ -4524,7 +4530,7 @@ var CBIAbstractSection = CBIAbstractElement.extend(/** @lends LuCI.form.Abstract
         * Returns `true` when the given UCI section ID should be handled and
         * `false` when it should be ignored.
         */
-       filter: function(section_id) {
+       filter(section_id) {
                return true;
        },
 
@@ -4539,15 +4545,15 @@ var CBIAbstractSection = CBIAbstractElement.extend(/** @lends LuCI.form.Abstract
         * been loaded. The promise may reject with an error if any of the child
         * elements load functions rejected with an error.
         */
-       load: function() {
-               var section_ids = this.cfgsections(),
-                   tasks = [];
+       load() {
+               const section_ids = this.cfgsections();
+               const tasks = [];
 
                if (Array.isArray(this.children))
-                       for (var i = 0; i &lt; section_ids.length; i++)
+                       for (let i = 0; i &lt; section_ids.length; i++)
                                tasks.push(this.loadChildren(section_ids[i])
-                                       .then(Function.prototype.bind.call(function(section_id, set_values) {
-                                               for (var i = 0; i &lt; set_values.length; i++)
+                                       .then(Function.prototype.bind.call((section_id, set_values) =>  {
+                                               for (let i = 0; i &lt; set_values.length; i++)
                                                        this.children[i].cfgvalue(section_id, set_values[i]);
                                        }, this, section_ids[i])));
 
@@ -4568,13 +4574,13 @@ var CBIAbstractSection = CBIAbstractElement.extend(/** @lends LuCI.form.Abstract
         * been parsed. The returned promise is rejected if any parsed values are
         * not meeting the validation constraints of their respective elements.
         */
-       parse: function() {
-               var section_ids = this.cfgsections(),
-                   tasks = [];
+       parse() {
+               const section_ids = this.cfgsections();
+               const tasks = [];
 
                if (Array.isArray(this.children))
-                       for (var i = 0; i &lt; section_ids.length; i++)
-                               for (var j = 0; j &lt; this.children.length; j++)
+                       for (let i = 0; i &lt; section_ids.length; i++)
+                               for (let j = 0; j &lt; this.children.length; j++)
                                        tasks.push(this.children[j].parse(section_ids[i]));
 
                return Promise.all(tasks);
@@ -4609,22 +4615,22 @@ var CBIAbstractSection = CBIAbstractElement.extend(/** @lends LuCI.form.Abstract
         * @throws {Error}
         * Throws an exception if a tab with the same `name` already exists.
         */
-       tab: function(name, title, description) {
+       tab(name, title, description) {
                if (this.tabs &amp;&amp; this.tabs[name])
                        throw 'Tab already declared';
 
-               var entry = {
-                       name: name,
-                       title: title,
-                       description: description,
+               const entry = {
+                       name,
+                       title,
+                       description,
                        children: []
                };
 
-               this.tabs = this.tabs || [];
+               this.tabs ??= [];
                this.tabs.push(entry);
                this.tabs[name] = entry;
 
-               this.tab_names = this.tab_names || [];
+               this.tab_names ??= [];
                this.tab_names.push(name);
        },
 
@@ -4652,11 +4658,11 @@ var CBIAbstractSection = CBIAbstractElement.extend(/** @lends LuCI.form.Abstract
         * @returns {LuCI.form.AbstractValue}
         * Returns the instantiated option class instance.
         */
-       option: function(cbiClass /*, ... */) {
+       option(cbiClass, ...args) {
                if (!CBIAbstractValue.isSubclass(cbiClass))
                        throw L.error('TypeError', 'Class must be a descendant of CBIAbstractValue');
 
-               var obj = cbiClass.instantiate(this.varargs(arguments, 1, this.map, this));
+               const obj = cbiClass.instantiate([ this.map, this, ...args ]);
                this.append(obj);
                return obj;
        },
@@ -4689,13 +4695,14 @@ var CBIAbstractSection = CBIAbstractElement.extend(/** @lends LuCI.form.Abstract
         * @returns {LuCI.form.AbstractValue}
         * Returns the instantiated option class instance.
         */
-       taboption: function(tabName /*, ... */) {
-               if (!this.tabs || !this.tabs[tabName])
+       taboption(tabName, ...args) {
+               if (!this.tabs?.[tabName])
                        throw L.error('ReferenceError', 'Associated tab not declared');
 
-               var obj = this.option.apply(this, this.varargs(arguments, 1));
+               const obj = this.option(...args);
                obj.tab = tabName;
                this.tabs[tabName].children.push(obj);
+
                return obj;
        },
 
@@ -4720,10 +4727,10 @@ var CBIAbstractSection = CBIAbstractElement.extend(/** @lends LuCI.form.Abstract
         * configuration values or just a single configuration value, depending
         * on the amount of passed arguments.
         */
-       cfgvalue: function(section_id, option) {
-               var rv = (arguments.length == 1) ? {} : null;
+       cfgvalue(section_id, option) {
+               const rv = (arguments.length == 1) ? {} : null;
 
-               for (var i = 0, o; (o = this.children[i]) != null; i++)
+               for (let i = 0, o; (o = this.children[i]) != null; i++)
                        if (rv)
                                rv[o.option] = o.cfgvalue(section_id);
                        else if (o.option == option)
@@ -4753,11 +4760,11 @@ var CBIAbstractSection = CBIAbstractElement.extend(/** @lends LuCI.form.Abstract
         * widget input values or just a single widget input value, depending
         * on the amount of passed arguments.
         */
-       formvalue: function(section_id, option) {
-               var rv = (arguments.length == 1) ? {} : null;
+       formvalue(section_id, option) {
+               const rv = (arguments.length == 1) ? {} : null;
 
-               for (var i = 0, o; (o = this.children[i]) != null; i++) {
-                       var func = this.map.root ? this.children[i].formvalue : this.children[i].cfgvalue;
+               for (let i = 0, o; (o = this.children[i]) != null; i++) {
+                       const func = this.map.root ? this.children[i].formvalue : this.children[i].cfgvalue;
 
                        if (rv)
                                rv[o.option] = func.call(o, section_id);
@@ -4789,10 +4796,10 @@ var CBIAbstractSection = CBIAbstractElement.extend(/** @lends LuCI.form.Abstract
         * widget input values or just a single widget input value, depending
         * on the amount of passed arguments.
         */
-       getUIElement: function(section_id, option) {
-               var rv = (arguments.length == 1) ? {} : null;
+       getUIElement(section_id, option) {
+               const rv = (arguments.length == 1) ? {} : null;
 
-               for (var i = 0, o; (o = this.children[i]) != null; i++)
+               for (let i = 0, o; (o = this.children[i]) != null; i++)
                        if (rv)
                                rv[o.option] = o.getUIElement(section_id);
                        else if (o.option == option)
@@ -4819,10 +4826,10 @@ var CBIAbstractSection = CBIAbstractElement.extend(/** @lends LuCI.form.Abstract
         * option instance objects or just a single object instance value,
         * depending on the amount of passed arguments.
         */
-       getOption: function(option) {
-               var rv = (arguments.length == 0) ? {} : null;
+       getOption(option) {
+               const rv = (arguments.length == 0) ? {} : null;
 
-               for (var i = 0, o; (o = this.children[i]) != null; i++)
+               for (let i = 0, o; (o = this.children[i]) != null; i++)
                        if (rv)
                                rv[o.option] = o;
                        else if (o.option == option)
@@ -4832,13 +4839,13 @@ var CBIAbstractSection = CBIAbstractElement.extend(/** @lends LuCI.form.Abstract
        },
 
        /** @private */
-       renderUCISection: function(section_id) {
-               var renderTasks = [];
+       renderUCISection(section_id) {
+               const renderTasks = [];
 
                if (!this.tabs)
                        return this.renderOptions(null, section_id);
 
-               for (var i = 0; i &lt; this.tab_names.length; i++)
+               for (let i = 0; i &lt; this.tab_names.length; i++)
                        renderTasks.push(this.renderOptions(this.tab_names[i], section_id));
 
                return Promise.all(renderTasks)
@@ -4846,19 +4853,19 @@ var CBIAbstractSection = CBIAbstractElement.extend(/** @lends LuCI.form.Abstract
        },
 
        /** @private */
-       renderTabContainers: function(section_id, nodes) {
-               var config_name = this.uciconfig || this.map.config,
-                   containerEls = E([]);
-
-               for (var i = 0; i &lt; nodes.length; i++) {
-                       var tab_name = this.tab_names[i],
-                           tab_data = this.tabs[tab_name],
-                           containerEl = E('div', {
-                               'id': 'container.%s.%s.%s'.format(config_name, section_id, tab_name),
-                               'data-tab': tab_name,
-                               'data-tab-title': tab_data.title,
-                               'data-tab-active': tab_name === this.selected_tab
-                           });
+       renderTabContainers(section_id, nodes) {
+               const config_name = this.uciconfig ?? this.map.config;
+               const containerEls = E([]);
+
+               for (let i = 0; i &lt; nodes.length; i++) {
+                       const tab_name = this.tab_names[i];
+                       const tab_data = this.tabs[tab_name];
+                       const containerEl = E('div', {
+                               'id': 'container.%s.%s.%s'.format(config_name, section_id, tab_name),
+                               'data-tab': tab_name,
+                               'data-tab-title': tab_data.title,
+                               'data-tab-active': tab_name === this.selected_tab
+                       });
 
                        if (tab_data.description != null &amp;&amp; tab_data.description != '')
                                containerEl.appendChild(
@@ -4872,25 +4879,25 @@ var CBIAbstractSection = CBIAbstractElement.extend(/** @lends LuCI.form.Abstract
        },
 
        /** @private */
-       renderOptions: function(tab_name, section_id) {
-               var in_table = (this instanceof CBITableSection);
-               return this.renderChildren(tab_name, section_id, in_table).then(function(nodes) {
-                       var optionEls = E([]);
-                       for (var i = 0; i &lt; nodes.length; i++)
+       renderOptions(tab_name, section_id) {
+               const in_table = (this instanceof CBITableSection);
+               return this.renderChildren(tab_name, section_id, in_table).then((nodes) =>  {
+                       const optionEls = E([]);
+                       for (let i = 0; i &lt; nodes.length; i++)
                                optionEls.appendChild(nodes[i]);
                        return optionEls;
                });
        },
 
        /** @private */
-       checkDepends: function(ev, n) {
-               var changed = false,
-                   sids = this.cfgsections();
+       checkDepends(ev, n) {
+               let changed = false;
+               const sids = this.cfgsections();
 
-               for (var i = 0, sid = sids[0]; (sid = sids[i]) != null; i++) {
-                       for (var j = 0, o = this.children[0]; (o = this.children[j]) != null; j++) {
-                               var isActive = o.isActive(sid),
-                                   isSatisified = o.checkDepends(sid);
+               for (let i = 0, sid = sids[0]; (sid = sids[i]) != null; i++) {
+                       for (let j = 0, o = this.children[0]; (o = this.children[j]) != null; j++) {
+                               let isActive = o.isActive(sid);
+                               const isSatisified = o.checkDepends(sid);
 
                                if (isActive != isSatisified) {
                                        o.setActive(sid, !isActive);
@@ -4908,7 +4915,7 @@ var CBIAbstractSection = CBIAbstractElement.extend(/** @lends LuCI.form.Abstract
 });
 
 
-var isEqual = function(x, y) {
+function isEqual(x, y) {
        if (typeof(y) == 'object' &amp;&amp; y instanceof RegExp)
                return (x == null) ? false : y.test(x);
 
@@ -4922,12 +4929,12 @@ var isEqual = function(x, y) {
                if (x.length != y.length)
                        return false;
 
-               for (var i = 0; i &lt; x.length; i++)
+               for (let i = 0; i &lt; x.length; i++)
                        if (!isEqual(x[i], y[i]))
                                return false;
        }
        else if (typeof(x) == 'object') {
-               for (var k in x) {
+               for (const k in x) {
                        if (x.hasOwnProperty(k) &amp;&amp; !y.hasOwnProperty(k))
                                return false;
 
@@ -4935,7 +4942,7 @@ var isEqual = function(x, y) {
                                return false;
                }
 
-               for (var k in y)
+               for (const k in y)
                        if (y.hasOwnProperty(k) &amp;&amp; !x.hasOwnProperty(k))
                                return false;
        }
@@ -4946,9 +4953,9 @@ var isEqual = function(x, y) {
        return true;
 };
 
-var isContained = function(x, y) {
+function isContained(x, y) {
        if (Array.isArray(x)) {
-               for (var i = 0; i &lt; x.length; i++)
+               for (let i = 0; i &lt; x.length; i++)
                        if (x[i] == y)
                                return true;
        }
@@ -4977,9 +4984,9 @@ var isContained = function(x, y) {
  *
  * This class is private and not directly accessible by user code.
  */
-var CBIAbstractValue = CBIAbstractElement.extend(/** @lends LuCI.form.AbstractValue.prototype */ {
-       __init__: function(map, section, option /*, ... */) {
-               this.super('__init__', this.varargs(arguments, 3));
+const CBIAbstractValue = CBIAbstractElement.extend(/** @lends LuCI.form.AbstractValue.prototype */ {
+       __init__(map, section, option, ...args) {
+               this.super('__init__', args);
 
                this.section = section;
                this.option = option;
@@ -5206,20 +5213,20 @@ var CBIAbstractValue = CBIAbstractElement.extend(/** @lends LuCI.form.AbstractVa
         *
         * &lt;ul>
         *   &lt;li>
-        *    &lt;code>!reverse&lt;/code>&lt;br>
-        *    Invert the dependency, instead of requiring another option to be
-        *    equal to the dependency value, that option should &lt;em>not&lt;/em> be
-        *    equal.
+        *      &lt;code>!reverse&lt;/code>&lt;br>
+        *      Invert the dependency, instead of requiring another option to be
+        *      equal to the dependency value, that option should &lt;em>not&lt;/em> be
+        *      equal.
         *   &lt;/li>
         *   &lt;li>
-        *    &lt;code>!contains&lt;/code>&lt;br>
-        *    Instead of requiring an exact match, the dependency is considered
-        *    satisfied when the dependency value is contained within the option
-        *    value.
+        *      &lt;code>!contains&lt;/code>&lt;br>
+        *      Instead of requiring an exact match, the dependency is considered
+        *      satisfied when the dependency value is contained within the option
+        *      value.
         *   &lt;/li>
         *   &lt;li>
-        *    &lt;code>!default&lt;/code>&lt;br>
-        *    The dependency is always satisfied
+        *      &lt;code>!default&lt;/code>&lt;br>
+        *      The dependency is always satisfied
         *   &lt;/li>
         * &lt;/ul>
         *
@@ -5245,7 +5252,7 @@ var CBIAbstractValue = CBIAbstractElement.extend(/** @lends LuCI.form.AbstractVa
         *  &lt;/li>
         *  &lt;li>
         *   &lt;code>opt.depends({ foo: "test" })&lt;br>
-        *         opt.depends({ bar: "qrx" })&lt;/code>&lt;br>
+        *               opt.depends({ bar: "qrx" })&lt;/code>&lt;br>
         *   Require either &lt;code>foo&lt;/code> to be set to &lt;code>test&lt;/code>,
         *   &lt;em>or&lt;/em> the &lt;code>bar&lt;/code> option to be &lt;code>qrx&lt;/code>.
         *  &lt;/li>
@@ -5269,8 +5276,8 @@ var CBIAbstractValue = CBIAbstractElement.extend(/** @lends LuCI.form.AbstractVa
         * specifies the expected value. In case an object is passed as first
         * argument, this parameter is ignored.
         */
-       depends: function(field, value) {
-               var deps;
+       depends(field, value) {
+               let deps;
 
                if (typeof(field) === 'string')
                        deps = {}, deps[field] = value;
@@ -5281,15 +5288,15 @@ var CBIAbstractValue = CBIAbstractElement.extend(/** @lends LuCI.form.AbstractVa
        },
 
        /** @private */
-       transformDepList: function(section_id, deplist) {
-               var list = deplist || this.deps,
-                   deps = [];
+       transformDepList(section_id, deplist) {
+               const list = deplist ?? this.deps;
+               const deps = [];
 
                if (Array.isArray(list)) {
-                       for (var i = 0; i &lt; list.length; i++) {
-                               var dep = {};
+                       for (let i = 0; i &lt; list.length; i++) {
+                               const dep = {};
 
-                               for (var k in list[i]) {
+                               for (const k in list[i]) {
                                        if (list[i].hasOwnProperty(k)) {
                                                if (k.charAt(0) === '!')
                                                        dep[k] = list[i][k];
@@ -5297,14 +5304,14 @@ var CBIAbstractValue = CBIAbstractElement.extend(/** @lends LuCI.form.AbstractVa
                                                        dep['cbid.%s'.format(k)] = list[i][k];
                                                else
                                                        dep['cbid.%s.%s.%s'.format(
-                                                               this.uciconfig || this.section.uciconfig || this.map.config,
-                                                               this.ucisection || section_id,
+                                                               this.uciconfig ?? this.section.uciconfig ?? this.map.config,
+                                                               this.ucisection ?? section_id,
                                                                k
                                                        )] = list[i][k];
                                        }
                                }
 
-                               for (var k in dep) {
+                               for (const k in dep) {
                                        if (dep.hasOwnProperty(k)) {
                                                deps.push(dep);
                                                break;
@@ -5317,22 +5324,22 @@ var CBIAbstractValue = CBIAbstractElement.extend(/** @lends LuCI.form.AbstractVa
        },
 
        /** @private */
-       transformChoices: function() {
+       transformChoices() {
                if (!Array.isArray(this.keylist) || this.keylist.length == 0)
                        return null;
 
-               var choices = {};
+               const choices = {};
 
-               for (var i = 0; i &lt; this.keylist.length; i++)
+               for (let i = 0; i &lt; this.keylist.length; i++)
                        choices[this.keylist[i]] = this.vallist[i];
 
                return choices;
        },
 
        /** @private */
-       checkDepends: function(section_id) {
-               var config_name = this.uciconfig || this.section.uciconfig || this.map.config,
-                   active = this.map.isDependencySatisfied(this.deps, config_name, section_id);
+       checkDepends(section_id) {
+               const config_name = this.uciconfig ?? this.section.uciconfig ?? this.map.config;
+               const active = this.map.isDependencySatisfied(this.deps, config_name, section_id);
 
                if (active)
                        this.updateDefaultValue(section_id);
@@ -5341,15 +5348,16 @@ var CBIAbstractValue = CBIAbstractElement.extend(/** @lends LuCI.form.AbstractVa
        },
 
        /** @private */
-       updateDefaultValue: function(section_id) {
+       updateDefaultValue(section_id) {
                if (!L.isObject(this.defaults))
                        return;
 
-               var config_name = this.uciconfig || this.section.uciconfig || this.map.config,
-                   cfgvalue = L.toArray(this.cfgvalue(section_id))[0],
-                   default_defval = null, satisified_defval = null;
+               const config_name = this.uciconfig ?? this.section.uciconfig ?? this.map.config;
+               const cfgvalue = L.toArray(this.cfgvalue(section_id))[0];
+               let default_defval = null;
+               let satisified_defval = null;
 
-               for (var value in this.defaults) {
+               for (const value in this.defaults) {
                        if (!this.defaults[value] || this.defaults[value].length == 0) {
                                default_defval = value;
                                continue;
@@ -5363,7 +5371,7 @@ var CBIAbstractValue = CBIAbstractElement.extend(/** @lends LuCI.form.AbstractVa
                if (satisified_defval == null)
                        satisified_defval = default_defval;
 
-               var node = this.map.findElement('id', this.cbid(section_id));
+               const node = this.map.findElement('id', this.cbid(section_id));
                if (node &amp;&amp; node.getAttribute('data-changed') != 'true' &amp;&amp; satisified_defval != null &amp;&amp; cfgvalue == null)
                        dom.callClassMethod(node, 'setValue', satisified_defval);
 
@@ -5387,12 +5395,12 @@ var CBIAbstractValue = CBIAbstractElement.extend(/** @lends LuCI.form.AbstractVa
         * @returns {string}
         * Returns the element ID.
         */
-       cbid: function(section_id) {
+       cbid(section_id) {
                if (section_id == null)
                        L.error('TypeError', 'Section ID required');
 
                return 'cbid.%s.%s.%s'.format(
-                       this.uciconfig || this.section.uciconfig || this.map.config,
+                       this.uciconfig ?? this.section.uciconfig ?? this.map.config,
                        section_id, this.option);
        },
 
@@ -5415,14 +5423,14 @@ var CBIAbstractValue = CBIAbstractElement.extend(/** @lends LuCI.form.AbstractVa
         * The return value of this function is filtered through `Promise.resolve()`
         * so it may return promises if overridden by user code.
         */
-       load: function(section_id) {
+       load(section_id) {
                if (section_id == null)
                        L.error('TypeError', 'Section ID required');
 
                return this.map.data.get(
-                       this.uciconfig || this.section.uciconfig || this.map.config,
-                       this.ucisection || section_id,
-                       this.ucioption || this.option);
+                       this.uciconfig ?? this.section.uciconfig ?? this.map.config,
+                       this.ucisection ?? section_id,
+                       this.ucioption ?? this.option);
        },
 
        /**
@@ -5438,9 +5446,9 @@ var CBIAbstractValue = CBIAbstractElement.extend(/** @lends LuCI.form.AbstractVa
         * Returns the `LuCI.ui` element instance or `null` in case the form
         * option implementation does not use `LuCI.ui` widgets.
         */
-       getUIElement: function(section_id) {
-               var node = this.map.findElement('id', this.cbid(section_id)),
-                   inst = node ? dom.findClassInstance(node) : null;
+       getUIElement(section_id) {
+               const node = this.map.findElement('id', this.cbid(section_id));
+               const inst = node ? dom.findClassInstance(node) : null;
                return (inst instanceof ui.AbstractElement) ? inst : null;
        },
 
@@ -5461,16 +5469,16 @@ var CBIAbstractValue = CBIAbstractElement.extend(/** @lends LuCI.form.AbstractVa
         * @returns {*}
         * Returns the configuration value.
         */
-       cfgvalue: function(section_id, set_value) {
+       cfgvalue(section_id, set_value) {
                if (section_id == null)
                        L.error('TypeError', 'Section ID required');
 
                if (arguments.length == 2) {
-                       this.data = this.data || {};
+                       this.data ??= {};
                        this.data[section_id] = set_value;
                }
 
-               return this.data ? this.data[section_id] : null;
+               return this.data?.[section_id];
        },
 
        /**
@@ -5489,8 +5497,8 @@ var CBIAbstractValue = CBIAbstractElement.extend(/** @lends LuCI.form.AbstractVa
         * @returns {*}
         * Returns the current input value.
         */
-       formvalue: function(section_id) {
-               var elem = this.getUIElement(section_id);
+       formvalue(section_id) {
+               const elem = this.getUIElement(section_id);
                return elem ? elem.getValue() : null;
        },
 
@@ -5513,8 +5521,8 @@ var CBIAbstractValue = CBIAbstractElement.extend(/** @lends LuCI.form.AbstractVa
         * @returns {string}
         * Returns the text representation of the current input value.
         */
-       textvalue: function(section_id) {
-               var cval = this.cfgvalue(section_id);
+       textvalue(section_id) {
+               let cval = this.cfgvalue(section_id);
 
                if (cval == null)
                        cval = this.default;
@@ -5548,7 +5556,7 @@ var CBIAbstractValue = CBIAbstractElement.extend(/** @lends LuCI.form.AbstractVa
         * return value is treated as failure, converted to a string and displayed
         * as error message to the user.
         */
-       validate: function(section_id, value) {
+       validate(section_id, value) {
                return true;
        },
 
@@ -5562,8 +5570,8 @@ var CBIAbstractValue = CBIAbstractElement.extend(/** @lends LuCI.form.AbstractVa
         * Returns `true` if the input value currently is valid, otherwise it
         * returns `false`.
         */
-       isValid: function(section_id) {
-               var elem = this.getUIElement(section_id);
+       isValid(section_id) {
+               const elem = this.getUIElement(section_id);
                return elem ? elem.isValid() : true;
        },
 
@@ -5576,8 +5584,8 @@ var CBIAbstractValue = CBIAbstractElement.extend(/** @lends LuCI.form.AbstractVa
         * @returns {string}
         * The validation error at this time
         */
-       getValidationError: function (section_id) {
-               var elem = this.getUIElement(section_id);
+       getValidationError(section_id) {
+               const elem = this.getUIElement(section_id);
                return elem ? elem.getValidationError() : '';
        },
 
@@ -5594,14 +5602,14 @@ var CBIAbstractValue = CBIAbstractElement.extend(/** @lends LuCI.form.AbstractVa
         * Returns `true` if the option element currently is active, otherwise it
         * returns `false`.
         */
-       isActive: function(section_id) {
-               var field = this.map.findElement('data-field', this.cbid(section_id));
+       isActive(section_id) {
+               const field = this.map.findElement('data-field', this.cbid(section_id));
                return (field != null &amp;&amp; !field.classList.contains('hidden'));
        },
 
        /** @private */
-       setActive: function(section_id, active) {
-               var field = this.map.findElement('data-field', this.cbid(section_id));
+       setActive(section_id, active) {
+               const field = this.map.findElement('data-field', this.cbid(section_id));
 
                if (field &amp;&amp; field.classList.contains('hidden') == active) {
                        field.classList[active ? 'remove' : 'add']('hidden');
@@ -5616,8 +5624,8 @@ var CBIAbstractValue = CBIAbstractElement.extend(/** @lends LuCI.form.AbstractVa
        },
 
        /** @private */
-       triggerValidation: function(section_id) {
-               var elem = this.getUIElement(section_id);
+       triggerValidation(section_id) {
+               const elem = this.getUIElement(section_id);
                return elem ? elem.triggerValidation() : true;
        },
 
@@ -5635,27 +5643,27 @@ var CBIAbstractValue = CBIAbstractElement.extend(/** @lends LuCI.form.AbstractVa
         * validated or rejecting in case the input value does not meet the
         * validation constraints.
         */
-       parse: function(section_id) {
-               var active = this.isActive(section_id);
+       parse(section_id) {
+               const active = this.isActive(section_id);
 
                if (active &amp;&amp; !this.isValid(section_id)) {
-                       var title = this.stripTags(this.title).trim(),
-                           error = this.getValidationError(section_id);
+                       const title = this.stripTags(this.title).trim();
+                       const error = this.getValidationError(section_id);
 
                        return Promise.reject(new TypeError(
-                               _('Option "%s" contains an invalid input value.').format(title || this.option) + ' ' + error));
+                               `${_('Option "%s" contains an invalid input value.').format(title || this.option)} ${error}`));
                }
 
                if (active) {
-                       var cval = this.cfgvalue(section_id),
-                           fval = this.formvalue(section_id);
+                       const cval = this.cfgvalue(section_id);
+                       const fval = this.formvalue(section_id);
 
                        if (fval == null || fval == '') {
                                if (this.rmempty || this.optional) {
                                        return Promise.resolve(this.remove(section_id));
                                }
                                else {
-                                       var title = this.stripTags(this.title).trim();
+                                       const title = this.stripTags(this.title).trim();
 
                                        return Promise.reject(new TypeError(
                                                _('Option "%s" must not be empty.').format(title || this.option)));
@@ -5692,11 +5700,11 @@ var CBIAbstractValue = CBIAbstractElement.extend(/** @lends LuCI.form.AbstractVa
         * @param {string|string[]}     formvalue
         * The input value to write.
         */
-       write: function(section_id, formvalue) {
+       write(section_id, formvalue) {
                return this.map.data.set(
-                       this.uciconfig || this.section.uciconfig || this.map.config,
-                       this.ucisection || section_id,
-                       this.ucioption || this.option,
+                       this.uciconfig ?? this.section.uciconfig ?? this.map.config,
+                       this.ucisection ?? section_id,
+                       this.ucioption ?? this.option,
                        formvalue);
        },
 
@@ -5715,20 +5723,20 @@ var CBIAbstractValue = CBIAbstractElement.extend(/** @lends LuCI.form.AbstractVa
         * @param {string} section_id
         * The configuration section ID
         */
-       remove: function(section_id) {
-               var this_cfg = this.uciconfig || this.section.uciconfig || this.map.config,
-                   this_sid = this.ucisection || section_id,
-                   this_opt = this.ucioption || this.option;
+       remove(section_id) {
+               const this_cfg = this.uciconfig ?? this.section.uciconfig ?? this.map.config;
+               const this_sid = this.ucisection ?? section_id;
+               const this_opt = this.ucioption ?? this.option;
 
-               for (var i = 0; i &lt; this.section.children.length; i++) {
-                       var sibling = this.section.children[i];
+               for (let i = 0; i &lt; this.section.children.length; i++) {
+                       const sibling = this.section.children[i];
 
                        if (sibling === this || sibling.ucioption == null)
                                continue;
 
-                       var sibling_cfg = sibling.uciconfig || sibling.section.uciconfig || sibling.map.config,
-                           sibling_sid = sibling.ucisection || section_id,
-                           sibling_opt = sibling.ucioption || sibling.option;
+                       const sibling_cfg = sibling.uciconfig ?? sibling.section.uciconfig ?? sibling.map.config;
+                       const sibling_sid = sibling.ucisection ?? section_id;
+                       const sibling_opt = sibling.ucioption ?? sibling.option;
 
                        if (this_cfg != sibling_cfg || this_sid != sibling_sid || this_opt != sibling_opt)
                                continue;
@@ -5774,7 +5782,7 @@ var CBIAbstractValue = CBIAbstractElement.extend(/** @lends LuCI.form.AbstractVa
  * @param {string} [description]
  * The description text of the form section element.
  */
-var CBITypedSection = CBIAbstractSection.extend(/** @lends LuCI.form.TypedSection.prototype */ {
+const CBITypedSection = CBIAbstractSection.extend(/** @lends LuCI.form.TypedSection.prototype */ {
        __name__: 'CBI.TypedSection',
 
        /**
@@ -5833,36 +5841,36 @@ var CBITypedSection = CBIAbstractSection.extend(/** @lends LuCI.form.TypedSectio
         */
 
        /** @override */
-       cfgsections: function() {
-               return this.map.data.sections(this.uciconfig || this.map.config, this.sectiontype)
-                       .map(function(s) { return s['.name'] })
+       cfgsections() {
+               return this.map.data.sections(this.uciconfig ?? this.map.config, this.sectiontype)
+                       .map((s) => { return s['.name'] })
                        .filter(L.bind(this.filter, this));
        },
 
        /** @private */
-       handleAdd: function(ev, name) {
-               var config_name = this.uciconfig || this.map.config;
+       handleAdd(ev, name) {
+               const config_name = this.uciconfig ?? this.map.config;
 
                this.map.data.add(config_name, this.sectiontype, name);
                return this.map.save(null, true);
        },
 
        /** @private */
-       handleRemove: function(section_id, ev) {
-               var config_name = this.uciconfig || this.map.config;
+       handleRemove(section_id, ev) {
+               const config_name = this.uciconfig ?? this.map.config;
 
                this.map.data.remove(config_name, section_id);
                return this.map.save(null, true);
        },
 
        /** @private */
-       renderSectionAdd: function(extra_class) {
+       renderSectionAdd(extra_class) {
                if (!this.addremove)
                        return E([]);
 
-               var createEl = E('div', { 'class': 'cbi-section-create' }),
-                   config_name = this.uciconfig || this.map.config,
-                   btn_title = this.titleFn('addbtntitle');
+               const createEl = E('div', { 'class': 'cbi-section-create' });
+               const config_name = this.uciconfig ?? this.map.config;
+               const btn_title = this.titleFn('addbtntitle');
 
                if (extra_class != null)
                        createEl.classList.add(extra_class);
@@ -5870,13 +5878,13 @@ var CBITypedSection = CBIAbstractSection.extend(/** @lends LuCI.form.TypedSectio
                if (this.anonymous) {
                        createEl.appendChild(E('button', {
                                'class': 'cbi-button cbi-button-add',
-                               'title': btn_title || _('Add'),
+                               'title': btn_title ?? _('Add'),
                                'click': ui.createHandlerFn(this, 'handleAdd'),
                                'disabled': this.map.readonly || null
-                       }, [ btn_title || _('Add') ]));
+                       }, [ btn_title ?? _('Add') ]));
                }
                else {
-                       var nameEl = E('input', {
+                       const nameEl = E('input', {
                                'type': 'text',
                                'class': 'cbi-section-create-name',
                                'disabled': this.map.readonly || null
@@ -5886,20 +5894,20 @@ var CBITypedSection = CBIAbstractSection.extend(/** @lends LuCI.form.TypedSectio
                                E('div', {}, nameEl),
                                E('button', {
                                        'class': 'cbi-button cbi-button-add',
-                                       'title': btn_title || _('Add'),
-                                       'click': ui.createHandlerFn(this, function(ev) {
+                                       'title': btn_title ?? _('Add'),
+                                       'click': ui.createHandlerFn(this, (ev) => {
                                                if (nameEl.classList.contains('cbi-input-invalid'))
                                                        return;
 
                                                return this.handleAdd(ev, nameEl.value);
                                        }),
                                        'disabled': this.map.readonly || true
-                               }, [ btn_title || _('Add') ])
+                               }, [ btn_title ?? _('Add') ])
                        ]);
 
                        if (this.map.readonly !== true) {
-                               ui.addValidator(nameEl, 'uciname', true, function(v) {
-                                       var button = createEl.querySelector('.cbi-section-create > .cbi-button-add');
+                               ui.addValidator(nameEl, 'uciname', true, (v) => {
+                                       const button = createEl.querySelector('.cbi-section-create > .cbi-button-add');
                                        if (v !== '') {
                                                button.disabled = null;
                                                return true;
@@ -5916,20 +5924,21 @@ var CBITypedSection = CBIAbstractSection.extend(/** @lends LuCI.form.TypedSectio
        },
 
        /** @private */
-       renderSectionPlaceholder: function() {
+       renderSectionPlaceholder() {
                return E('em', _('This section contains no values yet'));
        },
 
        /** @private */
-       renderContents: function(cfgsections, nodes) {
-               var section_id = null,
-                   config_name = this.uciconfig || this.map.config,
-                   sectionEl = E('div', {
-                               'id': 'cbi-%s-%s'.format(config_name, this.sectiontype),
-                               'class': 'cbi-section',
-                               'data-tab': (this.map.tabbed &amp;&amp; !this.parentoption) ? this.sectiontype : null,
-                               'data-tab-title': (this.map.tabbed &amp;&amp; !this.parentoption) ? this.title || this.sectiontype : null
-                       });
+       renderContents(cfgsections, nodes) {
+               const section_id = null;
+               const config_name = this.uciconfig ?? this.map.config;
+
+               const sectionEl = E('div', {
+                       'id': 'cbi-%s-%s'.format(config_name, this.sectiontype),
+                       'class': 'cbi-section',
+                       'data-tab': (this.map.tabbed &amp;&amp; !this.parentoption) ? this.sectiontype : null,
+                       'data-tab-title': (this.map.tabbed &amp;&amp; !this.parentoption) ? this.title || this.sectiontype : null
+               });
 
                if (this.title != null &amp;&amp; this.title != '')
                        sectionEl.appendChild(E('h3', {}, this.title));
@@ -5937,7 +5946,7 @@ var CBITypedSection = CBIAbstractSection.extend(/** @lends LuCI.form.TypedSectio
                if (this.description != null &amp;&amp; this.description != '')
                        sectionEl.appendChild(E('div', { 'class': 'cbi-section-descr' }, this.description));
 
-               for (var i = 0; i &lt; nodes.length; i++) {
+               for (let i = 0; i &lt; nodes.length; i++) {
                        if (this.addremove) {
                                sectionEl.appendChild(
                                        E('div', { 'class': 'cbi-section-remove right' },
@@ -5972,11 +5981,11 @@ var CBITypedSection = CBIAbstractSection.extend(/** @lends LuCI.form.TypedSectio
        },
 
        /** @override */
-       render: function() {
-               var cfgsections = this.cfgsections(),
-                   renderTasks = [];
+       render() {
+               const cfgsections = this.cfgsections();
+               const renderTasks = [];
 
-               for (var i = 0; i &lt; cfgsections.length; i++)
+               for (let i = 0; i &lt; cfgsections.length; i++)
                        renderTasks.push(this.renderUCISection(cfgsections[i]));
 
                return Promise.all(renderTasks).then(this.renderContents.bind(this, cfgsections));
@@ -6012,7 +6021,7 @@ var CBITypedSection = CBIAbstractSection.extend(/** @lends LuCI.form.TypedSectio
  * @param {string} [description]
  * The description text of the form section element.
  */
-var CBITableSection = CBITypedSection.extend(/** @lends LuCI.form.TableSection.prototype */ {
+const CBITableSection = CBITypedSection.extend(/** @lends LuCI.form.TableSection.prototype */ {
        __name__: 'CBI.TableSection',
 
        /**
@@ -6123,7 +6132,7 @@ var CBITableSection = CBITypedSection.extend(/** @lends LuCI.form.TableSection.p
         * @override
         * @throws Throws an exception when invoked.
         */
-       tab: function() {
+       tab() {
                throw 'Tabs are not supported by TableSection';
        },
 
@@ -6133,7 +6142,7 @@ var CBITableSection = CBITypedSection.extend(/** @lends LuCI.form.TableSection.p
         * is true. Optionally supply a name for the new section_id.
         */
        /** @private */
-       handleClone: function(section_id, put_next, name) {
+       handleClone(section_id, put_next, name) {
                let config_name = this.uciconfig || this.map.config;
 
                this.map.data.clone(config_name, this.sectiontype, section_id, put_next, name);
@@ -6141,23 +6150,25 @@ var CBITableSection = CBITypedSection.extend(/** @lends LuCI.form.TableSection.p
        },
 
        /** @private */
-       renderContents: function(cfgsections, nodes) {
-               var section_id = null,
-                   config_name = this.uciconfig || this.map.config,
-                   max_cols = isNaN(this.max_cols) ? this.children.length : this.max_cols,
-                   cloneable = this.cloneable,
-                   has_more = max_cols &lt; this.children.length,
-                   drag_sort = this.sortable &amp;&amp; !('ontouchstart' in window),
-                   touch_sort = this.sortable &amp;&amp; ('ontouchstart' in window),
-                   sectionEl = E('div', {
-                               'id': 'cbi-%s-%s'.format(config_name, this.sectiontype),
-                               'class': 'cbi-section cbi-tblsection',
-                               'data-tab': (this.map.tabbed &amp;&amp; !this.parentoption) ? this.sectiontype : null,
-                               'data-tab-title': (this.map.tabbed &amp;&amp; !this.parentoption) ? this.title || this.sectiontype : null
-                       }),
-                       tableEl = E('table', {
-                               'class': 'table cbi-section-table'
-                       });
+       renderContents(cfgsections, nodes) {
+               const section_id = null;
+               const config_name = this.uciconfig ?? this.map.config;
+               const max_cols = this.max_cols ?? this.children.length;
+               const cloneable = this.cloneable;
+               const has_more = max_cols &lt; this.children.length;
+               const drag_sort = this.sortable &amp;&amp; !('ontouchstart' in window);
+               const touch_sort = this.sortable &amp;&amp; ('ontouchstart' in window);
+
+               const sectionEl = E('div', {
+                       'id': 'cbi-%s-%s'.format(config_name, this.sectiontype),
+                       'class': 'cbi-section cbi-tblsection',
+                       'data-tab': (this.map.tabbed &amp;&amp; !this.parentoption) ? this.sectiontype : null,
+                       'data-tab-title': (this.map.tabbed &amp;&amp; !this.parentoption) ? this.title || this.sectiontype : null
+               });
+
+               const tableEl = E('table', {
+                       'class': 'table cbi-section-table'
+               });
 
                if (this.title != null &amp;&amp; this.title != '')
                        sectionEl.appendChild(E('h3', {}, this.title));
@@ -6165,15 +6176,15 @@ var CBITableSection = CBITypedSection.extend(/** @lends LuCI.form.TableSection.p
                if (this.description != null &amp;&amp; this.description != '')
                        sectionEl.appendChild(E('div', { 'class': 'cbi-section-descr' }, this.description));
 
-               tableEl.appendChild(this.renderHeaderRows(max_cols));
+               tableEl.appendChild(this.renderHeaderRows(false));
 
-               for (var i = 0; i &lt; nodes.length; i++) {
-                       var sectionname = this.titleFn('sectiontitle', cfgsections[i]);
+               for (let i = 0; i &lt; nodes.length; i++) {
+                       let sectionname = this.titleFn('sectiontitle', cfgsections[i]);
 
                        if (sectionname == null)
                                sectionname = cfgsections[i];
 
-                       var trEl = E('tr', {
+                       const trEl = E('tr', {
                                'id': 'cbi-%s-%s'.format(config_name, cfgsections[i]),
                                'class': 'tr cbi-section-table-row',
                                'data-sid': cfgsections[i],
@@ -6195,7 +6206,7 @@ var CBITableSection = CBITypedSection.extend(/** @lends LuCI.form.TableSection.p
                                trEl.classList.add(!(tableEl.childNodes.length % 2)
                                        ? 'cbi-rowstyle-1' : 'cbi-rowstyle-2');
 
-                       for (var j = 0; j &lt; max_cols &amp;&amp; nodes[i].firstChild; j++)
+                       for (let j = 0; j &lt; max_cols &amp;&amp; nodes[i].firstChild; j++)
                                trEl.appendChild(nodes[i].firstChild);
 
                        trEl.appendChild(this.renderRowActions(cfgsections[i], has_more ? _('More…') : null));
@@ -6216,15 +6227,15 @@ var CBITableSection = CBITypedSection.extend(/** @lends LuCI.form.TableSection.p
        },
 
        /** @private */
-       renderHeaderRows: function(max_cols, has_action) {
-               var has_titles = false,
-                   has_descriptions = false,
-                   max_cols = isNaN(this.max_cols) ? this.children.length : this.max_cols,
-                   has_more = max_cols &lt; this.children.length,
-                   anon_class = (!this.anonymous || this.sectiontitle) ? 'named' : 'anonymous',
-                   trEls = E([]);
-
-               for (var i = 0, opt; i &lt; max_cols &amp;&amp; (opt = this.children[i]) != null; i++) {
+       renderHeaderRows(has_action) {
+               let has_titles = false;
+               let has_descriptions = false;
+               const max_cols = this.max_cols ?? this.children.length;
+               const has_more = max_cols &lt; this.children.length;
+               const anon_class = (!this.anonymous || this.sectiontitle) ? 'named' : 'anonymous';
+               const trEls = E([]);
+
+               for (let i = 0, opt; i &lt; max_cols &amp;&amp; (opt = this.children[i]) != null; i++) {
                        if (opt.modalonly)
                                continue;
 
@@ -6233,13 +6244,13 @@ var CBITableSection = CBITypedSection.extend(/** @lends LuCI.form.TableSection.p
                }
 
                if (has_titles) {
-                       var trEl = E('tr', {
-                               'class': 'tr cbi-section-table-titles ' + anon_class,
+                       const trEl = E('tr', {
+                               'class': `tr cbi-section-table-titles ${anon_class}`,
                                'data-title': (!this.anonymous || this.sectiontitle) ? _('Name') : null,
                                'click': this.sortable ? ui.createHandlerFn(this, 'handleSort') : null
                        });
 
-                       for (var i = 0, opt; i &lt; max_cols &amp;&amp; (opt = this.children[i]) != null; i++) {
+                       for (let i = 0, opt; i &lt; max_cols &amp;&amp; (opt = this.children[i]) != null; i++) {
                                if (opt.modalonly)
                                        continue;
 
@@ -6251,13 +6262,13 @@ var CBITableSection = CBITypedSection.extend(/** @lends LuCI.form.TableSection.p
 
                                if (opt.width != null)
                                        trEl.lastElementChild.style.width =
-                                               (typeof(opt.width) == 'number') ? opt.width+'px' : opt.width;
+                                               (typeof(opt.width) == 'number') ? `${opt.width}px` : opt.width;
 
                                if (opt.titleref)
                                        trEl.lastElementChild.appendChild(E('a', {
                                                'href': opt.titleref,
                                                'class': 'cbi-title-ref',
-                                               'title': this.titledesc || _('Go to relevant configuration page')
+                                               'title': this.titledesc ?? _('Go to relevant configuration page')
                                        }, opt.title));
                                else
                                        dom.content(trEl.lastElementChild, opt.title);
@@ -6272,11 +6283,11 @@ var CBITableSection = CBITypedSection.extend(/** @lends LuCI.form.TableSection.p
                }
 
                if (has_descriptions &amp;&amp; !this.nodescriptions) {
-                       var trEl = E('tr', {
-                               'class': 'tr cbi-section-table-descr ' + anon_class
+                       const trEl = E('tr', {
+                               'class': `tr cbi-section-table-descr ${anon_class}`
                        });
 
-                       for (var i = 0, opt; i &lt; max_cols &amp;&amp; (opt = this.children[i]) != null; i++) {
+                       for (let i = 0, opt; i &lt; max_cols &amp;&amp; (opt = this.children[i]) != null; i++) {
                                if (opt.modalonly)
                                        continue;
 
@@ -6287,7 +6298,7 @@ var CBITableSection = CBITypedSection.extend(/** @lends LuCI.form.TableSection.p
 
                                if (opt.width != null)
                                        trEl.lastElementChild.style.width =
-                                               (typeof(opt.width) == 'number') ? opt.width+'px' : opt.width;
+                                               (typeof(opt.width) == 'number') ? `${opt.width}px` : opt.width;
                        }
 
                        if (this.sortable || this.extedit || this.addremove || has_more || has_action || this.cloneable)
@@ -6302,13 +6313,13 @@ var CBITableSection = CBITypedSection.extend(/** @lends LuCI.form.TableSection.p
        },
 
        /** @private */
-       renderRowActions: function(section_id, more_label) {
-               var config_name = this.uciconfig || this.map.config;
+       renderRowActions(section_id, more_label) {
+               const config_name = this.uciconfig ?? this.map.config;
 
                if (!this.sortable &amp;&amp; !this.extedit &amp;&amp; !this.addremove &amp;&amp; !more_label &amp;&amp; !this.cloneable)
                        return E([]);
 
-               var tdEl = E('td', {
+               const tdEl = E('td', {
                        'class': 'td cbi-section-table-cell nowrap cbi-section-actions'
                }, E('div'));
 
@@ -6324,12 +6335,12 @@ var CBITableSection = CBITypedSection.extend(/** @lends LuCI.form.TableSection.p
                }
 
                if (this.extedit) {
-                       var evFn = null;
+                       let evFn = null;
 
                        if (typeof(this.extedit) == 'function')
                                evFn = L.bind(this.extedit, this);
                        else if (typeof(this.extedit) == 'string')
-                               evFn = L.bind(function(sid, ev) {
+                               evFn = L.bind((sid, ev) => {
                                        location.href = this.extedit.format(sid);
                                }, this, section_id);
 
@@ -6353,7 +6364,7 @@ var CBITableSection = CBITypedSection.extend(/** @lends LuCI.form.TableSection.p
                }
 
                if (this.cloneable) {
-                       var btn_title = this.titleFn('clonebtntitle', section_id);
+                       const btn_title = this.titleFn('clonebtntitle', section_id);
 
                        dom.append(tdEl.lastElementChild,
                                E('button', {
@@ -6366,15 +6377,15 @@ var CBITableSection = CBITypedSection.extend(/** @lends LuCI.form.TableSection.p
                }
 
                if (this.addremove) {
-                       var btn_title = this.titleFn('removebtntitle', section_id);
+                       const btn_title = this.titleFn('removebtntitle', section_id);
 
                        dom.append(tdEl.lastElementChild,
                                E('button', {
-                                       'title': btn_title || _('Delete'),
+                                       'title': btn_title ?? _('Delete'),
                                        'class': 'btn cbi-button cbi-button-remove',
                                        'click': ui.createHandlerFn(this, 'handleRemove', section_id),
                                        'disabled': this.map.readonly || null
-                               }, [ btn_title || _('Delete') ])
+                               }, [ btn_title ?? _('Delete') ])
                        );
                }
 
@@ -6382,13 +6393,13 @@ var CBITableSection = CBITypedSection.extend(/** @lends LuCI.form.TableSection.p
        },
 
        /** @private */
-       handleDragInit: function(ev) {
+       handleDragInit(ev) {
                scope.dragState = { node: ev.target };
        },
 
        /** @private */
-       handleDragStart: function(ev) {
-               if (!scope.dragState || !scope.dragState.node.classList.contains('drag-handle')) {
+       handleDragStart(ev) {
+               if (!scope.dragState?.node.classList.contains('drag-handle')) {
                        scope.dragState = null;
                        return false;
                }
@@ -6399,11 +6410,11 @@ var CBITableSection = CBITypedSection.extend(/** @lends LuCI.form.TableSection.p
        },
 
        /** @private */
-       handleDragOver: function(ev) {
+       handleDragOver(ev) {
                if (scope.dragState === null ) return;
-               var n = scope.dragState.targetNode,
-                   r = scope.dragState.rect,
-                   t = r.top + r.height / 2;
+               const n = scope.dragState.targetNode;
+               const r = scope.dragState.rect;
+               const t = r.top + r.height / 2;
 
                if (ev.clientY &lt;= t) {
                        n.classList.remove('drag-over-below');
@@ -6420,51 +6431,51 @@ var CBITableSection = CBITypedSection.extend(/** @lends LuCI.form.TableSection.p
        },
 
        /** @private */
-       handleDragEnter: function(ev) {
+       handleDragEnter(ev) {
                if (scope.dragState === null ) return;
                scope.dragState.rect = ev.currentTarget.getBoundingClientRect();
                scope.dragState.targetNode = ev.currentTarget;
        },
 
        /** @private */
-       handleDragLeave: function(ev) {
+       handleDragLeave(ev) {
                ev.currentTarget.classList.remove('drag-over-above');
                ev.currentTarget.classList.remove('drag-over-below');
        },
 
        /** @private */
-       handleDragEnd: function(ev) {
-               var n = ev.target;
+       handleDragEnd(ev) {
+               const n = ev.target;
 
                n.style.opacity = '';
                n.classList.add('flash');
                n.parentNode.querySelectorAll('.drag-over-above, .drag-over-below')
-                       .forEach(function(tr) {
+                       .forEach((tr) => {
                                tr.classList.remove('drag-over-above');
                                tr.classList.remove('drag-over-below');
                        });
        },
 
        /** @private */
-       handleDrop: function(ev) {
-               if (scope.dragState === null ) return;
-               var s = scope.dragState;
+       handleDrop(ev) {
+               const s = scope.dragState;
+               if (!s) return;
 
                if (s.node &amp;&amp; s.targetNode) {
-                       var config_name = this.uciconfig || this.map.config,
-                           ref_node = s.targetNode,
-                           after = false;
+                       const config_name = this.uciconfig ?? this.map.config;
+                       let ref_node = s.targetNode;
+                       let after = false;
 
-                   if (ref_node.classList.contains('drag-over-below')) {
-                       ref_node = ref_node.nextElementSibling;
-                       after = true;
-                   }
+                       if (ref_node.classList.contains('drag-over-below')) {
+                               ref_node = ref_node.nextElementSibling;
+                               after = true;
+                       }
 
-                   var sid1 = s.node.getAttribute('data-sid'),
-                       sid2 = s.targetNode.getAttribute('data-sid');
+                       const sid1 = s.node.getAttribute('data-sid');
+                       const sid2 = s.targetNode.getAttribute('data-sid');
 
-                   s.node.parentNode.insertBefore(s.node, ref_node);
-                   this.map.data.move(config_name, sid1, sid2, after);
+                       s.node.parentNode.insertBefore(s.node, ref_node);
+                       this.map.data.move(config_name, sid1, sid2, after);
                }
 
                scope.dragState = null;
@@ -6475,12 +6486,14 @@ var CBITableSection = CBITypedSection.extend(/** @lends LuCI.form.TableSection.p
        },
 
        /** @private */
-       determineBackgroundColor: function(node) {
-               var r = 255, g = 255, b = 255;
+       determineBackgroundColor(node) {
+               let r = 255;
+               let g = 255;
+               let b = 255;
 
                while (node) {
-                       var s = window.getComputedStyle(node),
-                           c = (s.getPropertyValue('background-color') || '').replace(/ /g, '');
+                       const s = window.getComputedStyle(node);
+                       const c = (s.getPropertyValue('background-color') ?? '').replace(/ /g, '');
 
                        if (c != '' &amp;&amp; c != 'transparent' &amp;&amp; c != 'rgba(0,0,0,0)') {
                                if (/^#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})$/i.test(c)) {
@@ -6504,24 +6517,24 @@ var CBITableSection = CBITypedSection.extend(/** @lends LuCI.form.TableSection.p
        },
 
        /** @private */
-       handleTouchMove: function(ev) {
+       handleTouchMove(ev) {
                if (!ev.target.classList.contains('drag-handle'))
                        return;
 
-               var touchLoc = ev.targetTouches[0],
-                   rowBtn = ev.target,
-                   rowElem = dom.parent(rowBtn, '.tr'),
-                   htmlElem = document.querySelector('html'),
-                   dragHandle = document.querySelector('.touchsort-element'),
-                   viewportHeight = Math.max(document.documentElement.clientHeight, window.innerHeight || 0);
+               const touchLoc = ev.targetTouches[0];
+               const rowBtn = ev.target;
+               const rowElem = dom.parent(rowBtn, '.tr');
+               const htmlElem = document.querySelector('html');
+               let dragHandle = document.querySelector('.touchsort-element');
+               const viewportHeight = Math.max(document.documentElement.clientHeight, window.innerHeight ?? 0);
 
                if (!dragHandle) {
-                       var rowRect = rowElem.getBoundingClientRect(),
-                           btnRect = rowBtn.getBoundingClientRect(),
-                           paddingLeft = btnRect.left - rowRect.left,
-                           paddingRight = rowRect.right - btnRect.right,
-                           colorBg = this.determineBackgroundColor(rowElem),
-                           colorFg = (colorBg[0] * 0.299 + colorBg[1] * 0.587 + colorBg[2] * 0.114) > 186 ? [ 0, 0, 0 ] : [ 255, 255, 255 ];
+                       const rowRect = rowElem.getBoundingClientRect();
+                       const btnRect = rowBtn.getBoundingClientRect();
+                       const paddingLeft = btnRect.left - rowRect.left;
+                       const paddingRight = rowRect.right - btnRect.right;
+                       const colorBg = this.determineBackgroundColor(rowElem);
+                       const colorFg = (colorBg[0] * 0.299 + colorBg[1] * 0.587 + colorBg[2] * 0.114) > 186 ? [ 0, 0, 0 ] : [ 255, 255, 255 ];
 
                        dragHandle = E('div', { 'class': 'touchsort-element' }, [
                                E('strong', [ rowElem.getAttribute('data-title') ]),
@@ -6532,10 +6545,10 @@ var CBITableSection = CBITypedSection.extend(/** @lends LuCI.form.TableSection.p
                                position: 'absolute',
                                boxShadow: '0 0 3px rgba(%d, %d, %d, 1)'.format(colorFg[0], colorFg[1], colorFg[2]),
                                background: 'rgba(%d, %d, %d, 0.8)'.format(colorBg[0], colorBg[1], colorBg[2]),
-                               top: rowRect.top + 'px',
-                               left: rowRect.left + 'px',
-                               width: rowRect.width + 'px',
-                               height: (rowBtn.offsetHeight + 4) + 'px'
+                               top: `${rowRect.top}px`,
+                               left: `${rowRect.left}px`,
+                               width: `${rowRect.width}px`,
+                               height: `${rowBtn.offsetHeight + 4}px`
                        });
 
                        Object.assign(dragHandle.firstElementChild.style, {
@@ -6546,14 +6559,14 @@ var CBITableSection = CBITypedSection.extend(/** @lends LuCI.form.TableSection.p
                                textOverflow: 'ellipsis',
                                left: (paddingRight > paddingLeft) ? '' : '5px',
                                right: (paddingRight > paddingLeft) ? '5px' : '',
-                               width: (Math.max(paddingLeft, paddingRight) - 10) + 'px'
+                               width: `${Math.max(paddingLeft, paddingRight) - 10}px`
                        });
 
                        Object.assign(dragHandle.lastElementChild.style, {
                                position: 'absolute',
                                top: '2px',
-                               left: paddingLeft + 'px',
-                               width: rowBtn.offsetWidth + 'px'
+                               left: `${paddingLeft}px`,
+                               width: `${rowBtn.offsetWidth}px`
                        });
 
                        document.body.appendChild(dragHandle);
@@ -6562,13 +6575,13 @@ var CBITableSection = CBITypedSection.extend(/** @lends LuCI.form.TableSection.p
                        rowBtn.blur();
                }
 
-               dragHandle.style.top = (touchLoc.pageY - (parseInt(dragHandle.style.height) / 2)) + 'px';
+               dragHandle.style.top = `${touchLoc.pageY - (parseInt(dragHandle.style.height) / 2)}px`;
 
-               rowElem.parentNode.querySelectorAll('[draggable]').forEach(function(tr, i, trs) {
-                       var trRect = tr.getBoundingClientRect(),
-                           yTop = trRect.top + window.scrollY,
-                           yBottom = trRect.bottom + window.scrollY,
-                           yMiddle = yTop + ((yBottom - yTop) / 2);
+               rowElem.parentNode.querySelectorAll('[draggable]').forEach((tr, i, trs) => {
+                       const trRect = tr.getBoundingClientRect();
+                       const yTop = trRect.top + window.scrollY;
+                       const yBottom = trRect.bottom + window.scrollY;
+                       const yMiddle = yTop + ((yBottom - yTop) / 2);
 
                        tr.classList.remove('drag-over-above', 'drag-over-below');
 
@@ -6584,35 +6597,35 @@ var CBITableSection = CBITypedSection.extend(/** @lends LuCI.form.TableSection.p
                ev.preventDefault();
 
                if (touchLoc.clientY &lt; 30)
-                       window.requestAnimationFrame(function() { htmlElem.scrollTop -= 30 });
+                       window.requestAnimationFrame(() => { htmlElem.scrollTop -= 30 });
                else if (touchLoc.clientY > viewportHeight - 30)
-                       window.requestAnimationFrame(function() { htmlElem.scrollTop += 30 });
+                       window.requestAnimationFrame(() => { htmlElem.scrollTop += 30 });
        },
 
        /** @private */
-       handleTouchEnd: function(ev) {
-               var rowElem = dom.parent(ev.target, '.tr'),
-                   htmlElem = document.querySelector('html'),
-                   dragHandle = document.querySelector('.touchsort-element'),
-                   targetElem = rowElem.parentNode.querySelector('.drag-over-above, .drag-over-below'),
-                   viewportHeight = Math.max(document.documentElement.clientHeight, window.innerHeight || 0);
+       handleTouchEnd(ev) {
+               const rowElem = dom.parent(ev.target, '.tr');
+               const htmlElem = document.querySelector('html');
+               const dragHandle = document.querySelector('.touchsort-element');
+               const targetElem = rowElem.parentNode.querySelector('.drag-over-above, .drag-over-below');
+               const viewportHeight = Math.max(document.documentElement.clientHeight, window.innerHeight ?? 0);
 
                if (!dragHandle)
                        return;
 
                if (targetElem) {
-                   var isBelow = targetElem.classList.contains('drag-over-below');
+                       const isBelow = targetElem.classList.contains('drag-over-below');
 
                        rowElem.parentNode.insertBefore(rowElem, isBelow ? targetElem.nextElementSibling : targetElem);
 
                        this.map.data.move(
-                               this.uciconfig || this.map.config,
+                               this.uciconfig ?? this.map.config,
                                rowElem.getAttribute('data-sid'),
                                targetElem.getAttribute('data-sid'),
                                isBelow);
 
-                       window.requestAnimationFrame(function() {
-                               var rowRect = rowElem.getBoundingClientRect();
+                       window.requestAnimationFrame(() => {
+                               const rowRect = rowElem.getBoundingClientRect();
 
                                if (rowRect.top &lt; 50)
                                        htmlElem.scrollTop = (htmlElem.scrollTop + rowRect.top - 50);
@@ -6629,13 +6642,13 @@ var CBITableSection = CBITypedSection.extend(/** @lends LuCI.form.TableSection.p
        },
 
        /** @private */
-       handleModalCancel: function(modalMap, ev) {
-               var prevNode = this.getPreviousModalMap(),
-                   resetTasks = Promise.resolve();
+       handleModalCancel(modalMap, ev) {
+               const prevNode = this.getPreviousModalMap();
+               let resetTasks = Promise.resolve();
 
                if (prevNode) {
-                       var heading = prevNode.parentNode.querySelector('h4'),
-                           prevMap = dom.findClassInstance(prevNode);
+                       const heading = prevNode.parentNode.querySelector('h4');
+                       let prevMap = dom.findClassInstance(prevNode);
 
                        while (prevMap) {
                                resetTasks = resetTasks
@@ -6664,10 +6677,10 @@ var CBITableSection = CBITypedSection.extend(/** @lends LuCI.form.TableSection.p
        },
 
        /** @private */
-       handleModalSave: function(modalMap, ev) {
-               var mapNode = this.getActiveModalMap(),
-                   activeMap = dom.findClassInstance(mapNode),
-                   saveTasks = activeMap.save(null, true);
+       handleModalSave(modalMap, ev) {
+               const mapNode = this.getActiveModalMap();
+               let activeMap = dom.findClassInstance(mapNode);
+               let saveTasks = activeMap.save(null, true);
 
                while (activeMap.parent) {
                        activeMap = activeMap.parent;
@@ -6678,33 +6691,33 @@ var CBITableSection = CBITypedSection.extend(/** @lends LuCI.form.TableSection.p
 
                return saveTasks
                        .then(L.bind(this.handleModalCancel, this, modalMap, ev, true))
-                       .catch(function() {});
+                       .catch(() => {});
        },
 
        /** @private */
-       handleSort: function(ev) {
+       handleSort(ev) {
                if (!ev.target.matches('th[data-sortable-row]'))
                        return;
 
-               var th = ev.target,
-                   descending = (th.getAttribute('data-sort-direction') == 'desc'),
-                   config_name = this.uciconfig || this.map.config,
-                   index = 0,
-                   list = [];
+               const th = ev.target;
+               const descending = (th.getAttribute('data-sort-direction') == 'desc');
+               const config_name = this.uciconfig ?? this.map.config;
+               let index = 0;
+               const list = [];
 
-               ev.currentTarget.querySelectorAll('th').forEach(function(other_th, i) {
+               ev.currentTarget.querySelectorAll('th').forEach((other_th, i) => {
                        if (other_th !== th)
                                other_th.removeAttribute('data-sort-direction');
                        else
                                index = i;
                });
 
-               ev.currentTarget.parentNode.querySelectorAll('tr.cbi-section-table-row').forEach(L.bind(function(tr, i) {
-                       var sid = tr.getAttribute('data-sid'),
-                           opt = tr.childNodes[index].getAttribute('data-name'),
-                           val = this.cfgvalue(sid, opt);
+               ev.currentTarget.parentNode.querySelectorAll('tr.cbi-section-table-row').forEach(L.bind((tr, i) => {
+                       const sid = tr.getAttribute('data-sid');
+                       const opt = tr.childNodes[index].getAttribute('data-name');
+                       const val = this.cfgvalue(sid, opt);
 
-                       tr.querySelectorAll('.flash').forEach(function(n) {
+                       tr.querySelectorAll('.flash').forEach((n) => {
                                n.classList.remove('flash')
                        });
 
@@ -6716,16 +6729,17 @@ var CBITableSection = CBITypedSection.extend(/** @lends LuCI.form.TableSection.p
                        ]);
                }, this));
 
-               list.sort(function(a, b) {
+               list.sort((a, b) => {
                        return descending
                                ? -L.naturalCompare(a[0], b[0])
                                : L.naturalCompare(a[0], b[0]);
                });
 
-               window.requestAnimationFrame(L.bind(function() {
-                       var ref_sid, cur_sid;
+               window.requestAnimationFrame(L.bind(() => {
+                       let ref_sid;
+                       let cur_sid;
 
-                       for (var i = 0; i &lt; list.length; i++) {
+                       for (let i = 0; i &lt; list.length; i++) {
                                list[i][1].childNodes[index].classList.add('flash');
                                th.parentNode.parentNode.appendChild(list[i][1]);
 
@@ -6766,37 +6780,37 @@ var CBITableSection = CBITypedSection.extend(/** @lends LuCI.form.TableSection.p
         * custom logic to perform asynchronous work before the modal dialog
         * is shown.
         */
-       addModalOptions: function(modalSection, section_id, ev) {
+       addModalOptions(modalSection, section_id, ev) {
 
        },
 
        /** @private */
-       getActiveModalMap: function() {
+       getActiveModalMap() {
                return document.querySelector('body.modal-overlay-active > #modal_overlay > .modal.cbi-modal > .cbi-map:not(.hidden)');
        },
 
        /** @private */
-       getPreviousModalMap: function() {
-               var mapNode = this.getActiveModalMap(),
-                   prevNode = mapNode ? mapNode.previousElementSibling : null;
+       getPreviousModalMap() {
+               const mapNode = this.getActiveModalMap();
+               const prevNode = mapNode ? mapNode.previousElementSibling : null;
 
                return (prevNode &amp;&amp; prevNode.matches('.cbi-map.hidden')) ? prevNode : null;
        },
 
        /** @private */
-       cloneOptions: function(src_section, dest_section) {
-               for (var i = 0; i &lt; src_section.children.length; i++) {
-                       var o1 = src_section.children[i];
+       cloneOptions(src_section, dest_section) {
+               for (let i = 0; i &lt; src_section.children.length; i++) {
+                       const o1 = src_section.children[i];
 
                        if (o1.modalonly === false &amp;&amp; src_section === this)
                                continue;
 
-                       var o2;
+                       let o2;
 
                        if (o1.subsection) {
                                o2 = dest_section.option(o1.constructor, o1.option, o1.subsection.constructor, o1.subsection.sectiontype, o1.subsection.title, o1.subsection.description);
 
-                               for (var k in o1.subsection) {
+                               for (const k in o1.subsection) {
                                        if (!o1.subsection.hasOwnProperty(k))
                                                continue;
 
@@ -6817,7 +6831,7 @@ var CBITableSection = CBITypedSection.extend(/** @lends LuCI.form.TableSection.p
                                o2 = dest_section.option(o1.constructor, o1.option, o1.title, o1.description);
                        }
 
-                       for (var k in o1) {
+                       for (const k in o1) {
                                if (!o1.hasOwnProperty(k))
                                        continue;
 
@@ -6838,17 +6852,17 @@ var CBITableSection = CBITypedSection.extend(/** @lends LuCI.form.TableSection.p
        },
 
        /** @private */
-       renderMoreOptionsModal: function(section_id, ev) {
-               var parent = this.map,
-                   sref = parent.data.get(parent.config, section_id),
-                   mapNode = this.getActiveModalMap(),
-                   activeMap = mapNode ? dom.findClassInstance(mapNode) : null,
-                   stackedMap = activeMap &amp;&amp; (activeMap.parent !== parent || activeMap.section !== section_id);
-
-               return (stackedMap ? activeMap.save(null, true) : Promise.resolve()).then(L.bind(function() {
+       renderMoreOptionsModal(section_id, ev) {
+               const parent = this.map;
+               const sref = parent.data.get(parent.config, section_id);
+               const mapNode = this.getActiveModalMap();
+               const activeMap = mapNode ? dom.findClassInstance(mapNode) : null;
+               const stackedMap = activeMap &amp;&amp; (activeMap.parent !== parent || activeMap.section !== section_id);
+
+               return (stackedMap ? activeMap.save(null, true) : Promise.resolve()).then(L.bind(() => {
                        section_id = sref['.name'];
 
-                       var m;
+                       let m;
 
                        if (parent instanceof CBIJSONMap) {
                                m = new CBIJSONMap(null, null, null);
@@ -6858,7 +6872,7 @@ var CBITableSection = CBITypedSection.extend(/** @lends LuCI.form.TableSection.p
                                m = new CBIMap(parent.config, null, null);
                        }
 
-                       var s = m.section(CBINamedSection, section_id, this.sectiontype);
+                       const s = m.section(CBINamedSection, section_id, this.sectiontype);
 
                        m.parent = parent;
                        m.section = section_id;
@@ -6869,11 +6883,11 @@ var CBITableSection = CBITypedSection.extend(/** @lends LuCI.form.TableSection.p
 
                        this.cloneOptions(this, s);
 
-                       return Promise.resolve(this.addModalOptions(s, section_id, ev)).then(function() {
+                       return Promise.resolve(this.addModalOptions(s, section_id, ev)).then(() => {
                                return m.render();
-                       }).then(L.bind(function(nodes) {
-                               var title = parent.title,
-                                   name = null;
+                       }).then(L.bind((nodes) => {
+                               let title = parent.title;
+                               let name = null;
 
                                if ((name = this.titleFn('modaltitle', section_id)) != null)
                                        title = name;
@@ -6885,7 +6899,7 @@ var CBITableSection = CBITypedSection.extend(/** @lends LuCI.form.TableSection.p
                                if (stackedMap) {
                                        mapNode.parentNode
                                                .querySelector('h4')
-                                               .appendChild(E('span', title ? ' » ' + title : ''));
+                                               .appendChild(E('span', title ? ` » ${title}` : ''));
 
                                        mapNode.parentNode
                                                .querySelector('div.button-row > button')
@@ -6957,7 +6971,7 @@ var CBITableSection = CBITypedSection.extend(/** @lends LuCI.form.TableSection.p
  * @param {string} [description]
  * The description text of the form section element.
  */
-var CBIGridSection = CBITableSection.extend(/** @lends LuCI.form.GridSection.prototype */ {
+const CBIGridSection = CBITableSection.extend(/** @lends LuCI.form.GridSection.prototype */ {
        /**
         * Add an option tab to the section.
         *
@@ -6986,16 +7000,16 @@ var CBIGridSection = CBITableSection.extend(/** @lends LuCI.form.GridSection.pro
         * @throws {Error}
         * Throws an exception if a tab with the same `name` already exists.
         */
-       tab: function(name, title, description) {
+       tab(name, title, description) {
                CBIAbstractSection.prototype.tab.call(this, name, title, description);
        },
 
        /** @private */
-       handleAdd: function(ev, name) {
-               var config_name = this.uciconfig || this.map.config,
-                   section_id = this.map.data.add(config_name, this.sectiontype, name),
-                   mapNode = this.getPreviousModalMap(),
-                   prevMap = mapNode ? dom.findClassInstance(mapNode) : this.map;
+       handleAdd(ev, name) {
+               const config_name = this.uciconfig ?? this.map.config;
+               const section_id = this.map.data.add(config_name, this.sectiontype, name);
+               const mapNode = this.getPreviousModalMap();
+               const prevMap = mapNode ? dom.findClassInstance(mapNode) : this.map;
 
                prevMap.addedSection = section_id;
 
@@ -7003,18 +7017,18 @@ var CBIGridSection = CBITableSection.extend(/** @lends LuCI.form.GridSection.pro
        },
 
        /** @private */
-       handleModalSave: function(/* ... */) {
-               var mapNode = this.getPreviousModalMap(),
-                   prevMap = mapNode ? dom.findClassInstance(mapNode) : this.map;
+       handleModalSave(...args) /* ... */{
+               const mapNode = this.getPreviousModalMap();
+               const prevMap = mapNode ? dom.findClassInstance(mapNode) : this.map;
 
-               return this.super('handleModalSave', arguments);
+               return this.super('handleModalSave', args);
        },
 
        /** @private */
-       handleModalCancel: function(modalMap, ev, isSaving) {
-               var config_name = this.uciconfig || this.map.config,
-                   mapNode = this.getPreviousModalMap(),
-                   prevMap = mapNode ? dom.findClassInstance(mapNode) : this.map;
+       handleModalCancel(modalMap, ev, isSaving) {
+               const config_name = this.uciconfig ?? this.map.config;
+               const mapNode = this.getPreviousModalMap();
+               const prevMap = mapNode ? dom.findClassInstance(mapNode) : this.map;
 
                if (prevMap.addedSection != null &amp;&amp; !isSaving)
                        this.map.data.remove(config_name, prevMap.addedSection);
@@ -7025,15 +7039,16 @@ var CBIGridSection = CBITableSection.extend(/** @lends LuCI.form.GridSection.pro
        },
 
        /** @private */
-       renderUCISection: function(section_id) {
+       renderUCISection(section_id) {
                return this.renderOptions(null, section_id);
        },
 
        /** @private */
-       renderChildren: function(tab_name, section_id, in_table) {
-               var tasks = [], index = 0;
+       renderChildren(tab_name, section_id, in_table) {
+               const tasks = [];
+               let index = 0;
 
-               for (var i = 0, opt; (opt = this.children[i]) != null; i++) {
+               for (let i = 0, opt; (opt = this.children[i]) != null; i++) {
                        if (opt.disable || opt.modalonly)
                                continue;
 
@@ -7047,10 +7062,10 @@ var CBIGridSection = CBITableSection.extend(/** @lends LuCI.form.GridSection.pro
        },
 
        /** @private */
-       renderTextValue: function(section_id, opt) {
-               var title = this.stripTags(opt.title).trim(),
-                   descr = this.stripTags(opt.description).trim(),
-                   value = opt.textvalue(section_id);
+       renderTextValue(section_id, opt) {
+               const title = this.stripTags(opt.title).trim();
+               const descr = this.stripTags(opt.description).trim();
+               const value = opt.textvalue(section_id);
 
                return E('td', {
                        'class': 'td cbi-value-field',
@@ -7062,23 +7077,23 @@ var CBIGridSection = CBITableSection.extend(/** @lends LuCI.form.GridSection.pro
        },
 
        /** @private */
-       renderHeaderRows: function(section_id) {
-               return this.super('renderHeaderRows', [ NaN, true ]);
+       renderHeaderRows(section_id) {
+               return this.super('renderHeaderRows', [ true ]);
        },
 
        /** @private */
-       renderRowActions: function(section_id) {
+       renderRowActions(section_id) {
                return this.super('renderRowActions', [ section_id, _('Edit') ]);
        },
 
        /** @override */
-       parse: function() {
-               var section_ids = this.cfgsections(),
-                   tasks = [];
+       parse() {
+               const section_ids = this.cfgsections();
+               const tasks = [];
 
                if (Array.isArray(this.children)) {
-                       for (var i = 0; i &lt; section_ids.length; i++) {
-                               for (var j = 0; j &lt; this.children.length; j++) {
+                       for (let i = 0; i &lt; section_ids.length; i++) {
+                               for (let j = 0; j &lt; this.children.length; j++) {
                                        if (!this.children[j].editable || this.children[j].modalonly)
                                                continue;
 
@@ -7120,10 +7135,10 @@ var CBIGridSection = CBITableSection.extend(/** @lends LuCI.form.GridSection.pro
  * @param {string} [description]
  * The description text of the form section element.
  */
-var CBINamedSection = CBIAbstractSection.extend(/** @lends LuCI.form.NamedSection.prototype */ {
+const CBINamedSection = CBIAbstractSection.extend(/** @lends LuCI.form.NamedSection.prototype */ {
        __name__: 'CBI.NamedSection',
-       __init__: function(map, section_id /*, ... */) {
-               this.super('__init__', this.varargs(arguments, 2, map));
+       __init__(map, section_id, ...args) {
+               this.super('__init__', [ map, ...args ]);
 
                this.section = section_id;
        },
@@ -7157,39 +7172,41 @@ var CBINamedSection = CBIAbstractSection.extend(/** @lends LuCI.form.NamedSectio
         * @returns {string[]}
         * Returns a one-element array containing the mapped section ID.
         */
-       cfgsections: function() {
+       cfgsections() {
                return [ this.section ];
        },
 
        /** @private */
-       handleAdd: function(ev) {
-               var section_id = this.section,
-                   config_name = this.uciconfig || this.map.config;
+       handleAdd(ev) {
+               const section_id = this.section;
+               const config_name = this.uciconfig ?? this.map.config;
 
                this.map.data.add(config_name, this.sectiontype, section_id);
                return this.map.save(null, true);
        },
 
        /** @private */
-       handleRemove: function(ev) {
-               var section_id = this.section,
-                   config_name = this.uciconfig || this.map.config;
+       handleRemove(ev) {
+               const section_id = this.section;
+               const config_name = this.uciconfig ?? this.map.config;
 
                this.map.data.remove(config_name, section_id);
                return this.map.save(null, true);
        },
 
        /** @private */
-       renderContents: function(data) {
-               var ucidata = data[0], nodes = data[1],
-                   section_id = this.section,
-                   config_name = this.uciconfig || this.map.config,
-                   sectionEl = E('div', {
-                               'id': ucidata ? null : 'cbi-%s-%s'.format(config_name, section_id),
-                               'class': 'cbi-section',
-                               'data-tab': (this.map.tabbed &amp;&amp; !this.parentoption) ? this.sectiontype : null,
-                               'data-tab-title': (this.map.tabbed &amp;&amp; !this.parentoption) ? this.title || this.sectiontype : null
-                       });
+       renderContents(data) {
+               const ucidata = data[0];
+               const nodes = data[1];
+               const section_id = this.section;
+               const config_name = this.uciconfig ?? this.map.config;
+
+               const sectionEl = E('div', {
+                       'id': ucidata ? null : 'cbi-%s-%s'.format(config_name, section_id),
+                       'class': 'cbi-section',
+                       'data-tab': (this.map.tabbed &amp;&amp; !this.parentoption) ? this.sectiontype : null,
+                       'data-tab-title': (this.map.tabbed &amp;&amp; !this.parentoption) ? this.title || this.sectiontype : null
+               });
 
                if (typeof(this.title) === 'string' &amp;&amp; this.title !== '')
                        sectionEl.appendChild(E('h3', {}, this.title));
@@ -7230,9 +7247,9 @@ var CBINamedSection = CBIAbstractSection.extend(/** @lends LuCI.form.NamedSectio
        },
 
        /** @override */
-       render: function() {
-               var config_name = this.uciconfig || this.map.config,
-                   section_id = this.section;
+       render() {
+               const config_name = this.uciconfig ?? this.map.config;
+               const section_id = this.section;
 
                return Promise.all([
                        this.map.data.get(config_name, section_id),
@@ -7273,7 +7290,7 @@ var CBINamedSection = CBIAbstractSection.extend(/** @lends LuCI.form.NamedSectio
  * @param {string} [description]
  * The description text of the option element.
  */
-var CBIValue = CBIAbstractValue.extend(/** @lends LuCI.form.Value.prototype */ {
+const CBIValue = CBIAbstractValue.extend(/** @lends LuCI.form.Value.prototype */ {
        __name__: 'CBI.Value',
 
        /**
@@ -7306,27 +7323,27 @@ var CBIValue = CBIAbstractValue.extend(/** @lends LuCI.form.Value.prototype */ {
         * The caption for the choice value. May be a DOM node, a document fragment
         * or a plain text string. If omitted, the `key` value is used as caption.
         */
-       value: function(key, val) {
-               this.keylist = this.keylist || [];
+       value(key, val) {
+               this.keylist ??= [];
                this.keylist.push(String(key));
 
-               this.vallist = this.vallist || [];
+               this.vallist ??= [];
                this.vallist.push(dom.elem(val) ? val : String(val != null ? val : key));
        },
 
        /** @override */
-       render: function(option_index, section_id, in_table) {
+       render(option_index, section_id, in_table) {
                return Promise.resolve(this.cfgvalue(section_id))
                        .then(this.renderWidget.bind(this, section_id, option_index))
                        .then(this.renderFrame.bind(this, section_id, in_table, option_index));
        },
 
        /** @private */
-       handleValueChange: function(section_id, state, ev) {
+       handleValueChange(section_id, state, ev) {
                if (typeof(this.onchange) != 'function')
                        return;
 
-               var value = this.formvalue(section_id);
+               const value = this.formvalue(section_id);
 
                if (isEqual(value, state.previousValue))
                        return;
@@ -7336,13 +7353,13 @@ var CBIValue = CBIAbstractValue.extend(/** @lends LuCI.form.Value.prototype */ {
        },
 
        /** @private */
-       renderFrame: function(section_id, in_table, option_index, nodes) {
-               var config_name = this.uciconfig || this.section.uciconfig || this.map.config,
-                   depend_list = this.transformDepList(section_id),
-                   optionEl;
+       renderFrame(section_id, in_table, option_index, nodes) {
+               const config_name = this.uciconfig ?? this.section.uciconfig ?? this.map.config;
+               const depend_list = this.transformDepList(section_id);
+               let optionEl;
 
                if (in_table) {
-                       var title = this.stripTags(this.title).trim();
+                       const title = this.stripTags(this.title).trim();
                        optionEl = E('td', {
                                'class': 'td cbi-value-field',
                                'data-title': (title != '') ? title : null,
@@ -7374,9 +7391,9 @@ var CBIValue = CBIAbstractValue.extend(/** @lends LuCI.form.Value.prototype */ {
                                optionEl.appendChild(E('label', {
                                        'class': 'cbi-value-title',
                                        'for': 'widget.cbid.%s.%s.%s'.format(config_name, section_id, this.option),
-                                       'click': function(ev) {
-                                               var node = ev.currentTarget,
-                                                   elem = node.nextElementSibling.querySelector('#' + node.getAttribute('for')) || node.nextElementSibling.querySelector('[data-widget-id="' + node.getAttribute('for') + '"]');
+                                       'click': (ev) => {
+                                               const node = ev.currentTarget;
+                                               const elem = node.nextElementSibling.querySelector(`#${node.getAttribute('for')}`) ?? node.nextElementSibling.querySelector(`[data-widget-id="${node.getAttribute('for')}"]`);
 
                                                if (elem) {
                                                        elem.click();
@@ -7387,7 +7404,7 @@ var CBIValue = CBIAbstractValue.extend(/** @lends LuCI.form.Value.prototype */ {
                                this.titleref ? E('a', {
                                        'class': 'cbi-title-ref',
                                        'href': this.titleref,
-                                       'title': this.titledesc || _('Go to relevant configuration page')
+                                       'title': this.titledesc ?? _('Go to relevant configuration page')
                                }, this.title) : this.title));
 
                                optionEl.appendChild(E('div', { 'class': 'cbi-value-field' }));
@@ -7395,10 +7412,10 @@ var CBIValue = CBIAbstractValue.extend(/** @lends LuCI.form.Value.prototype */ {
                }
 
                if (nodes)
-                       (optionEl.lastChild || optionEl).appendChild(nodes);
+                       (optionEl.lastChild ?? optionEl).appendChild(nodes);
 
                if (!in_table &amp;&amp; typeof(this.description) === 'string' &amp;&amp; this.description !== '')
-                       dom.append(optionEl.lastChild || optionEl,
+                       dom.append(optionEl.lastChild ?? optionEl,
                                E('div', { 'class': 'cbi-value-description' }, this.description.trim()));
 
                if (depend_list &amp;&amp; depend_list.length)
@@ -7416,13 +7433,13 @@ var CBIValue = CBIAbstractValue.extend(/** @lends LuCI.form.Value.prototype */ {
        },
 
        /** @private */
-       renderWidget: function(section_id, option_index, cfgvalue) {
-               var value = (cfgvalue != null) ? cfgvalue : this.default,
-                   choices = this.transformChoices(),
-                   widget;
+       renderWidget(section_id, option_index, cfgvalue) {
+               const value = (cfgvalue != null) ? cfgvalue : this.default;
+               const choices = this.transformChoices();
+               let widget;
 
                if (choices) {
-                       var placeholder = (this.optional || this.rmempty)
+                       const placeholder = (this.optional || this.rmempty)
                                ? E('em', _('unspecified')) : _('-- Please choose --');
 
                        widget = new ui.Combobox(Array.isArray(value) ? value.join(' ') : value, choices, {
@@ -7430,7 +7447,7 @@ var CBIValue = CBIAbstractValue.extend(/** @lends LuCI.form.Value.prototype */ {
                                sort: this.keylist,
                                optional: this.optional || this.rmempty,
                                datatype: this.datatype,
-                               select_placeholder: this.placeholder || placeholder,
+                               select_placeholder: this.placeholder ?? placeholder,
                                validate: L.bind(this.validate, this, section_id),
                                disabled: (this.readonly != null) ? this.readonly : this.map.readonly
                        });
@@ -7483,16 +7500,16 @@ var CBIValue = CBIAbstractValue.extend(/** @lends LuCI.form.Value.prototype */ {
  * @param {string} [description]
  * The description text of the option element.
  */
-var CBIDynamicList = CBIValue.extend(/** @lends LuCI.form.DynamicList.prototype */ {
+const CBIDynamicList = CBIValue.extend(/** @lends LuCI.form.DynamicList.prototype */ {
        __name__: 'CBI.DynamicList',
 
        /** @private */
-       renderWidget: function(section_id, option_index, cfgvalue) {
-               var value = (cfgvalue != null) ? cfgvalue : this.default,
-                   choices = this.transformChoices(),
-                   items = L.toArray(value);
+       renderWidget(section_id, option_index, cfgvalue) {
+               const value = (cfgvalue != null) ? cfgvalue : this.default;
+               const choices = this.transformChoices();
+               const items = L.toArray(value);
 
-               var widget = new ui.DynamicList(items, choices, {
+               const widget = new ui.DynamicList(items, choices, {
                        id: this.cbid(section_id),
                        sort: this.keylist,
                        optional: this.optional || this.rmempty,
@@ -7538,11 +7555,11 @@ var CBIDynamicList = CBIValue.extend(/** @lends LuCI.form.DynamicList.prototype
  * @param {string} [description]
  * The description text of the option element.
  */
-var CBIListValue = CBIValue.extend(/** @lends LuCI.form.ListValue.prototype */ {
+const CBIListValue = CBIValue.extend(/** @lends LuCI.form.ListValue.prototype */ {
        __name__: 'CBI.ListValue',
 
-       __init__: function() {
-               this.super('__init__', arguments);
+       __init__(...args) {
+               this.super('__init__', args);
                this.widget = 'select';
                this.orientation = 'horizontal';
                this.deplist = [];
@@ -7580,9 +7597,9 @@ var CBIListValue = CBIValue.extend(/** @lends LuCI.form.ListValue.prototype */ {
         */
 
         /** @private */
-       renderWidget: function(section_id, option_index, cfgvalue) {
-               var choices = this.transformChoices();
-               var widget = new ui.Select((cfgvalue != null) ? cfgvalue : this.default, choices, {
+       renderWidget(section_id, option_index, cfgvalue) {
+               const choices = this.transformChoices();
+               const widget = new ui.Select((cfgvalue != null) ? cfgvalue : this.default, choices, {
                        id: this.cbid(section_id),
                        size: this.size,
                        sort: this.keylist,
@@ -7631,10 +7648,10 @@ var CBIListValue = CBIValue.extend(/** @lends LuCI.form.ListValue.prototype */ {
  * @param {string} [description]
  * The description text of the option element.
  */
-var CBIRichListValue = CBIListValue.extend(/** @lends LuCI.form.ListValue.prototype */ {
+const CBIRichListValue = CBIListValue.extend(/** @lends LuCI.form.ListValue.prototype */ {
        __name__: 'CBI.RichListValue',
 
-       __init__: function() {
+       __init__() {
                this.super('__init__', arguments);
                this.widget = 'select';
                this.orientation = 'horizontal';
@@ -7673,9 +7690,9 @@ var CBIRichListValue = CBIListValue.extend(/** @lends LuCI.form.ListValue.protot
         */
 
         /** @private */
-       renderWidget: function(section_id, option_index, cfgvalue) {
-               var choices = this.transformChoices();
-               var widget = new ui.Dropdown((cfgvalue != null) ? cfgvalue : this.default, choices, {
+       renderWidget(section_id, option_index, cfgvalue) {
+               const choices = this.transformChoices();
+               const widget = new ui.Dropdown((cfgvalue != null) ? cfgvalue : this.default, choices, {
                        id: this.cbid(section_id),
                        size: this.size,
                        sort: this.keylist,
@@ -7710,7 +7727,7 @@ var CBIRichListValue = CBIListValue.extend(/** @lends LuCI.form.ListValue.protot
         * implemented as a simple ListValue entry.
         * 
         */
-       value: function(value, title, description) {
+       value(value, title, description) {
                if (description) {
                        CBIListValue.prototype.value.call(this, value, E([], [
                                E('span', { 'class': 'hide-open' }, [ title ]),
@@ -7758,11 +7775,11 @@ var CBIRichListValue = CBIListValue.extend(/** @lends LuCI.form.ListValue.protot
  * @param {string} [description]
  * The description text of the option element.
  */
-var CBIFlagValue = CBIValue.extend(/** @lends LuCI.form.FlagValue.prototype */ {
+const CBIFlagValue = CBIValue.extend(/** @lends LuCI.form.FlagValue.prototype */ {
        __name__: 'CBI.FlagValue',
 
-       __init__: function() {
-               this.super('__init__', arguments);
+       __init__(...args) {
+               this.super('__init__', args);
 
                this.enabled = '1';
                this.disabled = '0';
@@ -7811,20 +7828,20 @@ var CBIFlagValue = CBIValue.extend(/** @lends LuCI.form.FlagValue.prototype */ {
         */
 
        /** @private */
-       renderWidget: function(section_id, option_index, cfgvalue) {
-               var tooltip = null;
+       renderWidget(section_id, option_index, cfgvalue) {
+               let tooltip = null;
 
                if (typeof(this.tooltip) == 'function')
-                       tooltip = this.tooltip.apply(this, [section_id]);
+                       tooltip = this.tooltip(section_id);
                else if (typeof(this.tooltip) == 'string')
-                       tooltip = (arguments.length > 1) ? ''.format.apply(this.tooltip, this.varargs(arguments, 1)) : this.tooltip;
+                       tooltip = this.tooltip.format(section_id);
 
-               var widget = new ui.Checkbox((cfgvalue != null) ? cfgvalue : this.default, {
+               const widget = new ui.Checkbox((cfgvalue != null) ? cfgvalue : this.default, {
                        id: this.cbid(section_id),
                        value_enabled: this.enabled,
                        value_disabled: this.disabled,
                        validate: L.bind(this.validate, this, section_id),
-                       tooltip: tooltip,
+                       tooltip,
                        tooltipicon: this.tooltipicon,
                        disabled: (this.readonly != null) ? this.readonly : this.map.readonly
                });
@@ -7839,9 +7856,9 @@ var CBIFlagValue = CBIValue.extend(/** @lends LuCI.form.FlagValue.prototype */ {
         *
         * @override
         */
-       formvalue: function(section_id) {
-               var elem = this.getUIElement(section_id),
-                   checked = elem ? elem.isChecked() : false;
+       formvalue(section_id) {
+               const elem = this.getUIElement(section_id);
+               const checked = elem ? elem.isChecked() : false;
                return checked ? this.enabled : this.disabled;
        },
 
@@ -7851,8 +7868,8 @@ var CBIFlagValue = CBIValue.extend(/** @lends LuCI.form.FlagValue.prototype */ {
         *
         * @override
         */
-       textvalue: function(section_id) {
-               var cval = this.cfgvalue(section_id);
+       textvalue(section_id) {
+               let cval = this.cfgvalue(section_id);
 
                if (cval == null)
                        cval = this.default;
@@ -7861,15 +7878,16 @@ var CBIFlagValue = CBIValue.extend(/** @lends LuCI.form.FlagValue.prototype */ {
        },
 
        /** @override */
-       parse: function(section_id) {
+       parse(section_id) {
                if (this.isActive(section_id)) {
-                       var fval = this.formvalue(section_id);
+                       const fval = this.formvalue(section_id);
 
                        if (!this.isValid(section_id)) {
-                               var title = this.stripTags(this.title).trim();
-                               var error = this.getValidationError(section_id);
+                               const title = this.stripTags(this.title).trim();
+                               const error = this.getValidationError(section_id);
+
                                return Promise.reject(new TypeError(
-                                       _('Option "%s" contains an invalid input value.').format(title || this.option) + ' ' + error));
+                                       `${_('Option "%s" contains an invalid input value.').format(title || this.option)} ${error}`));
                        }
 
                        if (fval == this.default &amp;&amp; (this.optional || this.rmempty))
@@ -7915,11 +7933,11 @@ var CBIFlagValue = CBIValue.extend(/** @lends LuCI.form.FlagValue.prototype */ {
  * @param {string} [description]
  * The description text of the option element.
  */
-var CBIMultiValue = CBIDynamicList.extend(/** @lends LuCI.form.MultiValue.prototype */ {
+const CBIMultiValue = CBIDynamicList.extend(/** @lends LuCI.form.MultiValue.prototype */ {
        __name__: 'CBI.MultiValue',
 
-       __init__: function() {
-               this.super('__init__', arguments);
+       __init__(...args) {
+               this.super('__init__', args);
                this.placeholder = _('-- Please choose --');
        },
 
@@ -7952,19 +7970,19 @@ var CBIMultiValue = CBIDynamicList.extend(/** @lends LuCI.form.MultiValue.protot
         */
 
        /** @private */
-       renderWidget: function(section_id, option_index, cfgvalue) {
-               var value = (cfgvalue != null) ? cfgvalue : this.default,
-                   choices = this.transformChoices();
+       renderWidget(section_id, option_index, cfgvalue) {
+               const value = (cfgvalue != null) ? cfgvalue : this.default;
+               const choices = this.transformChoices();
 
-               var widget = new ui.Dropdown(L.toArray(value), choices, {
+               const widget = new ui.Dropdown(L.toArray(value), choices, {
                        id: this.cbid(section_id),
                        sort: this.keylist,
                        multiple: true,
                        optional: this.optional || this.rmempty,
                        select_placeholder: this.placeholder,
-                       create: this.create,
-                       display_items: this.display_size || this.size || 3,
-                       dropdown_items: this.dropdown_size || this.size || -1,
+                       create: this.create,            
+                       display_items: this.display_size ?? this.size ?? 3,
+                       dropdown_items: this.dropdown_size ?? this.size ?? -1,
                        validate: L.bind(this.validate, this, section_id),
                        disabled: (this.readonly != null) ? this.readonly : this.map.readonly
                });
@@ -8004,7 +8022,7 @@ var CBIMultiValue = CBIDynamicList.extend(/** @lends LuCI.form.MultiValue.protot
  * @param {string} [description]
  * The description text of the option element.
  */
-var CBITextValue = CBIValue.extend(/** @lends LuCI.form.TextValue.prototype */ {
+const CBITextValue = CBIValue.extend(/** @lends LuCI.form.TextValue.prototype */ {
        __name__: 'CBI.TextValue',
 
        /** @ignore */
@@ -8047,10 +8065,10 @@ var CBITextValue = CBIValue.extend(/** @lends LuCI.form.TextValue.prototype */ {
         */
 
        /** @private */
-       renderWidget: function(section_id, option_index, cfgvalue) {
-               var value = (cfgvalue != null) ? cfgvalue : this.default;
+       renderWidget(section_id, option_index, cfgvalue) {
+               const value = (cfgvalue != null) ? cfgvalue : this.default;
 
-               var widget = new ui.Textarea(value, {
+               const widget = new ui.Textarea(value, {
                        id: this.cbid(section_id),
                        optional: this.optional || this.rmempty,
                        placeholder: this.placeholder,
@@ -8097,7 +8115,7 @@ var CBITextValue = CBIValue.extend(/** @lends LuCI.form.TextValue.prototype */ {
  * @param {string} [description]
  * The description text of the option element.
  */
-var CBIDummyValue = CBIValue.extend(/** @lends LuCI.form.DummyValue.prototype */ {
+const CBIDummyValue = CBIValue.extend(/** @lends LuCI.form.DummyValue.prototype */ {
        __name__: 'CBI.DummyValue',
 
        /**
@@ -8123,7 +8141,7 @@ var CBIDummyValue = CBIValue.extend(/** @lends LuCI.form.DummyValue.prototype */
         * @default null
         */
 
-    /**
+       /**
         * Render the UCI option value as hidden using the HTML display: none style property.
         *
         * By default, the value is displayed
@@ -8134,15 +8152,15 @@ var CBIDummyValue = CBIValue.extend(/** @lends LuCI.form.DummyValue.prototype */
         */
 
        /** @private */
-       renderWidget: function(section_id, option_index, cfgvalue) {
-               var value = (cfgvalue != null) ? cfgvalue : this.default,
-                   hiddenEl = new ui.Hiddenfield(value, { id: this.cbid(section_id) }),
-                   outputEl = E('div', { 'style': this.hidden ? 'display:none' : null });
+       renderWidget(section_id, option_index, cfgvalue) {
+               const value = (cfgvalue != null) ? cfgvalue : this.default;
+               const hiddenEl = new ui.Hiddenfield(value, { id: this.cbid(section_id) });
+               const outputEl = E('div', { 'style': this.hidden ? 'display:none' : null });
 
                if (this.href &amp;&amp; !((this.readonly != null) ? this.readonly : this.map.readonly))
                        outputEl.appendChild(E('a', { 'href': this.href }));
 
-               dom.append(outputEl.lastChild || outputEl,
+               dom.append(outputEl.lastChild ?? outputEl,
                        this.rawhtml ? value : [ value ]);
 
                return E([
@@ -8152,10 +8170,10 @@ var CBIDummyValue = CBIValue.extend(/** @lends LuCI.form.DummyValue.prototype */
        },
 
        /** @override */
-       remove: function() {},
+       remove() {},
 
        /** @override */
-       write: function() {}
+       write() {}
 });
 
 /**
@@ -8189,7 +8207,7 @@ var CBIDummyValue = CBIValue.extend(/** @lends LuCI.form.DummyValue.prototype */
  * @param {string} [description]
  * The description text of the option element.
  */
-var CBIButtonValue = CBIValue.extend(/** @lends LuCI.form.ButtonValue.prototype */ {
+const CBIButtonValue = CBIValue.extend(/** @lends LuCI.form.ButtonValue.prototype */ {
        __name__: 'CBI.ButtonValue',
 
        /**
@@ -8244,24 +8262,24 @@ var CBIButtonValue = CBIValue.extend(/** @lends LuCI.form.ButtonValue.prototype
         */
 
        /** @private */
-       renderWidget: function(section_id, option_index, cfgvalue) {
-               var value = (cfgvalue != null) ? cfgvalue : this.default,
-                   hiddenEl = new ui.Hiddenfield(value, { id: this.cbid(section_id) }),
-                   outputEl = E('div'),
-                   btn_title = this.titleFn('inputtitle', section_id) || this.titleFn('title', section_id);
+       renderWidget(section_id, option_index, cfgvalue) {
+               const value = (cfgvalue != null) ? cfgvalue : this.default;
+               const hiddenEl = new ui.Hiddenfield(value, { id: this.cbid(section_id) });
+               const outputEl = E('div');
+               const btn_title = this.titleFn('inputtitle', section_id) ?? this.titleFn('title', section_id);
 
                if (value !== false)
                        dom.content(outputEl, [
                                E('button', {
-                                       'class': 'cbi-button cbi-button-%s'.format(this.inputstyle || 'button'),
-                                       'click': ui.createHandlerFn(this, function(section_id, ev) {
+                                       'class': 'cbi-button cbi-button-%s'.format(this.inputstyle ?? 'button'),
+                                       'click': ui.createHandlerFn(this, (section_id, ev) => {
                                                if (this.onclick)
                                                        return this.onclick(ev, section_id);
 
                                                ev.currentTarget.parentNode.nextElementSibling.value = value;
                                                return this.map.save();
                                        }, section_id),
-                                       'disabled': ((this.readonly != null) ? this.readonly : this.map.readonly) || null
+                                       'disabled': (this.readonly ?? this.map.readonly) || null
                                }, [ btn_title ])
                        ]);
                else
@@ -8312,12 +8330,12 @@ var CBIButtonValue = CBIValue.extend(/** @lends LuCI.form.ButtonValue.prototype
  * @param {string} [description]
  * The description text of the option element.
  */
-var CBIHiddenValue = CBIValue.extend(/** @lends LuCI.form.HiddenValue.prototype */ {
+const CBIHiddenValue = CBIValue.extend(/** @lends LuCI.form.HiddenValue.prototype */ {
        __name__: 'CBI.HiddenValue',
 
        /** @private */
-       renderWidget: function(section_id, option_index, cfgvalue) {
-               var widget = new ui.Hiddenfield((cfgvalue != null) ? cfgvalue : this.default, {
+       renderWidget(section_id, option_index, cfgvalue) {
+               const widget = new ui.Hiddenfield((cfgvalue != null) ? cfgvalue : this.default, {
                        id: this.cbid(section_id)
                });
 
@@ -8356,11 +8374,11 @@ var CBIHiddenValue = CBIValue.extend(/** @lends LuCI.form.HiddenValue.prototype
  * @param {string} [description]
  * The description text of the option element.
  */
-var CBIFileUpload = CBIValue.extend(/** @lends LuCI.form.FileUpload.prototype */ {
+const CBIFileUpload = CBIValue.extend(/** @lends LuCI.form.FileUpload.prototype */ {
        __name__: 'CBI.FileSelect',
 
-       __init__: function(/* ... */) {
-               this.super('__init__', arguments);
+       __init__(...args) {
+               this.super('__init__', args);
 
                this.browser = false;
                this.show_hidden = false;
@@ -8448,8 +8466,8 @@ var CBIFileUpload = CBIValue.extend(/** @lends LuCI.form.FileUpload.prototype */
         */
 
        /** @private */
-       renderWidget: function(section_id, option_index, cfgvalue) {
-               var browserEl = new ui.FileUpload((cfgvalue != null) ? cfgvalue : this.default, {
+       renderWidget(section_id, option_index, cfgvalue) {
+               const browserEl = new ui.FileUpload((cfgvalue != null) ? cfgvalue : this.default, {
                        id: this.cbid(section_id),
                        name: this.cbid(section_id),
                        browser: this.browser,
@@ -8503,15 +8521,15 @@ var CBIFileUpload = CBIValue.extend(/** @lends LuCI.form.FileUpload.prototype */
  * All further arguments are passed as-is to the subclass constructor. Refer
  * to the corresponding class constructor documentations for details.
  */
-var CBISectionValue = CBIValue.extend(/** @lends LuCI.form.SectionValue.prototype */ {
+const CBISectionValue = CBIValue.extend(/** @lends LuCI.form.SectionValue.prototype */ {
        __name__: 'CBI.ContainerValue',
-       __init__: function(map, section, option, cbiClass /*, ... */) {
-               this.super('__init__', [map, section, option]);
+       __init__(map, section, option, cbiClass, ...args) {
+               this.super('__init__', [ map, section, option ]);
 
                if (!CBIAbstractSection.isSubclass(cbiClass))
                        throw 'Sub section must be a descendent of CBIAbstractSection';
 
-               this.subsection = cbiClass.instantiate(this.varargs(arguments, 4, this.map));
+               this.subsection = cbiClass.instantiate([ this.map, ...args ]);
                this.subsection.parentoption = this;
        },
 
@@ -8526,22 +8544,22 @@ var CBISectionValue = CBIValue.extend(/** @lends LuCI.form.SectionValue.prototyp
         */
 
        /** @override */
-       load: function(section_id) {
+       load(section_id) {
                return this.subsection.load(section_id);
        },
 
        /** @override */
-       parse: function(section_id) {
+       parse(section_id) {
                return this.subsection.parse(section_id);
        },
 
        /** @private */
-       renderWidget: function(section_id, option_index, cfgvalue) {
+       renderWidget(section_id, option_index, cfgvalue) {
                return this.subsection.render(section_id);
        },
 
        /** @private */
-       checkDepends: function(section_id) {
+       checkDepends(section_id) {
                this.subsection.checkDepends(section_id);
                return CBIValue.prototype.checkDepends.apply(this, [ section_id ]);
        },
@@ -8552,7 +8570,7 @@ var CBISectionValue = CBIValue.extend(/** @lends LuCI.form.SectionValue.prototyp
         *
         * @override
         */
-       value: function() {},
+       value() {},
 
        /**
         * Since the section container is not tied to any UCI configuration,
@@ -8560,7 +8578,7 @@ var CBISectionValue = CBIValue.extend(/** @lends LuCI.form.SectionValue.prototyp
         *
         * @override
         */
-       write: function() {},
+       write() {},
 
        /**
         * Since the section container is not tied to any UCI configuration,
@@ -8568,7 +8586,7 @@ var CBISectionValue = CBIValue.extend(/** @lends LuCI.form.SectionValue.prototyp
         *
         * @override
         */
-       remove: function() {},
+       remove() {},
 
        /**
         * Since the section container is not tied to any UCI configuration,
@@ -8577,7 +8595,7 @@ var CBISectionValue = CBIValue.extend(/** @lends LuCI.form.SectionValue.prototyp
         * @override
         * @returns {null}
         */
-       cfgvalue: function() { return null },
+       cfgvalue() { return null },
 
        /**
         * Since the section container is not tied to any UCI configuration,
@@ -8586,7 +8604,7 @@ var CBISectionValue = CBIValue.extend(/** @lends LuCI.form.SectionValue.prototyp
         * @override
         * @returns {null}
         */
-       formvalue: function() { return null }
+       formvalue() { return null }
 });
 
 /**
@@ -8613,7 +8631,7 @@ var CBISectionValue = CBIValue.extend(/** @lends LuCI.form.SectionValue.prototyp
  * 'use strict';
  * 'require form';
  *
- * var m, s, o;
+ * let m, s, o;
  *
  * m = new form.Map('example', 'Example form',
  *     'This is an example form mapping the contents of /etc/config/example');
@@ -8627,7 +8645,7 @@ var CBISectionValue = CBIValue.extend(/** @lends LuCI.form.SectionValue.prototyp
  * o.value('choice1', 'The first choice');
  * o.value('choice2', 'The second choice');
  *
- * m.render().then(function(node) {
+ * m.render().then((node) => {
  *     document.body.appendChild(node);
  * });
  * &lt;/pre>
@@ -8668,7 +8686,7 @@ return baseclass.extend(/** @lends LuCI.form.prototype */ {
         
 
         <footer>
-            Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Thu Dec 19 2024 19:20:35 GMT+0000 (Coordinated Universal Time)
+            Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Fri Dec 20 2024 00:14:55 GMT+0000 (Coordinated Universal Time)
         </footer>
     </div>
 </div>
index 8bf92b5ac0851eaee9adcc533ee6a92d97ab3abb..589d722b1486d5d8f2cf8c00e3a22fabb4f17e1c 100644 (file)
@@ -86,6 +86,8 @@
             
                 <li data-name="LuCI#hasViewPermission"><a href="LuCI.html#hasViewPermission">hasViewPermission</a></li>
             
+                <li data-name="LuCI#isArguments"><a href="LuCI.html#isArguments">isArguments</a></li>
+            
                 <li data-name="LuCI#isObject"><a href="LuCI.html#isObject">isObject</a></li>
             
                 <li data-name="LuCI#location"><a href="LuCI.html#location">location</a></li>
@@ -4077,7 +4079,7 @@ return FileSystem;
         
 
         <footer>
-            Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Thu Dec 19 2024 19:20:35 GMT+0000 (Coordinated Universal Time)
+            Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Fri Dec 20 2024 00:14:55 GMT+0000 (Coordinated Universal Time)
         </footer>
     </div>
 </div>
index 3718ef5bc8c44e6e0798194e7f951961692f28c4..8e9e3c4fc2c55c78239723ce994d87c894e867e4 100644 (file)
@@ -86,6 +86,8 @@
             
                 <li data-name="LuCI#hasViewPermission"><a href="LuCI.html#hasViewPermission">hasViewPermission</a></li>
             
+                <li data-name="LuCI#isArguments"><a href="LuCI.html#isArguments">isArguments</a></li>
+            
                 <li data-name="LuCI#isObject"><a href="LuCI.html#isObject">isObject</a></li>
             
                 <li data-name="LuCI#location"><a href="LuCI.html#location">location</a></li>
@@ -3664,7 +3666,7 @@ is the central <a target="_blank" href="https://openwrt.github.io/luci/jsapi/LuC
         
 
         <footer>
-            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Thu Dec 19 2024 19:20:35 GMT+0000 (Coordinated Universal Time)
+            Documentation generated by <a target="_blank" href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Fri Dec 20 2024 00:14:55 GMT+0000 (Coordinated Universal Time)
         </footer>
     </div>
 </div>
index c8f8e28f5493757f9e4084cf71e7561da33de05b..a8f7a92dc349a4556a576f70145cf6178cb525cc 100644 (file)
@@ -86,6 +86,8 @@
             
                 <li data-name="LuCI#hasViewPermission"><a href="LuCI.html#hasViewPermission">hasViewPermission</a></li>
             
+                <li data-name="LuCI#isArguments"><a href="LuCI.html#isArguments">isArguments</a></li>
+            
                 <li data-name="LuCI#isObject"><a href="LuCI.html#isObject">isObject</a></li>
             
                 <li data-name="LuCI#location"><a href="LuCI.html#location">location</a></li>
  * The environment settings to use for the LuCI runtime.
  */
 
-(function(window, document, undefined) {
+((window, document, undefined) => {
        'use strict';
 
-       var env = {};
-
-       /* Object.assign polyfill for IE */
-       if (typeof Object.assign !== 'function') {
-               Object.defineProperty(Object, 'assign', {
-                       value: function assign(target, varArgs) {
-                               if (target == null)
-                                       throw new TypeError('Cannot convert undefined or null to object');
-
-                               var to = Object(target);
-
-                               for (var index = 1; index &lt; arguments.length; index++)
-                                       if (arguments[index] != null)
-                                               for (var nextKey in arguments[index])
-                                                       if (Object.prototype.hasOwnProperty.call(arguments[index], nextKey))
-                                                               to[nextKey] = arguments[index][nextKey];
-
-                               return to;
-                       },
-                       writable: true,
-                       configurable: true
-               });
-       }
-
-       /* Promise.finally polyfill */
-       if (typeof Promise.prototype.finally !== 'function') {
-               Promise.prototype.finally = function(fn) {
-                       var onFinally = function(cb) {
-                               return Promise.resolve(fn.call(this)).then(cb);
-                       };
-
-                       return this.then(
-                               function(result) { return onFinally.call(this, function() { return result }) },
-                               function(reason) { return onFinally.call(this, function() { return Promise.reject(reason) }) }
-                       );
-               };
-       }
+       const env = {};
 
        /*
         * Class declaration and inheritance helper
         */
 
-       var toCamelCase = function(s) {
-               return s.replace(/(?:^|[\. -])(.)/g, function(m0, m1) { return m1.toUpperCase() });
-       };
+       const toCamelCase = s => s.replace(/(?:^|[\. -])(.)/g, (m0, m1) => m1.toUpperCase());
 
        /**
         * @class baseclass
         * It provides simple means to create subclasses of given classes and
         * implements prototypal inheritance.
         */
-       var superContext = {}, classIndex = 0, Class = Object.assign(function() {}, {
+       const superContext = {};
+
+       let classIndex = 0;
+
+       const Class = Object.assign(function() {}, {
                /**
                 * Extends this base class with the properties described in
                 * `properties` and returns a new subclassed Class instance
                 * class to enable inheritance. The resulting value represents a
                 * class constructor and can be instantiated with `new`.
                 */
-               extend: function(properties) {
-                       var props = {
+               extend(properties) {
+                       const props = {
                                __id__: { value: classIndex },
                                __base__: { value: this.prototype },
-                               __name__: { value: properties.__name__ || 'anonymous' + classIndex++ }
+                               __name__: { value: properties.__name__ ?? `anonymous${classIndex++}` }
                        };
 
-                       var ClassConstructor = function() {
+                       const ClassConstructor = function() {
                                if (!(this instanceof ClassConstructor))
                                        throw new TypeError('Constructor must not be called without "new"');
 
                                }
                        };
 
-                       for (var key in properties)
+                       for (const key in properties)
                                if (!props[key] &amp;&amp; properties.hasOwnProperty(key))
                                        props[key] = { value: properties[key], writable: true };
 
                        ClassConstructor.prototype = Object.create(this.prototype, props);
                        ClassConstructor.prototype.constructor = ClassConstructor;
                        Object.assign(ClassConstructor, this);
-                       ClassConstructor.displayName = toCamelCase(props.__name__.value + 'Class');
+                       ClassConstructor.displayName = toCamelCase(`${props.__name__.value}Class`);
 
                        return ClassConstructor;
                },
                 * properties with its prototype set to this base class to
                 * enable inheritance.
                 */
-               singleton: function(properties /*, ... */) {
-                       return Class.extend(properties)
-                               .instantiate(Class.prototype.varargs(arguments, 1));
+               singleton(properties, ...new_args) {
+                       return Class.extend(properties).instantiate(new_args);
                },
 
                /**
                 * An array of arbitrary values which will be passed as arguments
                 * to the constructor function.
                 *
-                * @param {...*} [new_args]
-                * Specifies arguments to be passed to the subclass constructor
-                * as-is in order to instantiate the new subclass.
-                *
                 * @returns {LuCI.baseclass}
                 * Returns a new LuCI.baseclass instance extended by the given
                 * properties with its prototype set to this base class to
                 * enable inheritance.
                 */
-               instantiate: function(args) {
-                       return new (Function.prototype.bind.apply(this,
-                               Class.prototype.varargs(args, 0, null)))();
+               instantiate(args) {
+                       return new (Function.prototype.bind.call(this, null, ...args))();
                },
 
                /* unused */
-               call: function(self, method) {
+               call(self, method, ...args) {
                        if (typeof(this.prototype[method]) != 'function')
-                               throw new ReferenceError(method + ' is not defined in class');
+                               throw new ReferenceError(`${method} is not defined in class`);
 
-                       return this.prototype[method].apply(self, self.varargs(arguments, 1));
+                       return this.prototype[method].call(self, method, ...args);
                },
 
                /**
                 * class or `false` if the given value is not a valid class or not
                 * a subclass of this class'.
                 */
-               isSubclass: function(classValue) {
-                       return (classValue != null &amp;&amp;
-                               typeof(classValue) == 'function' &amp;&amp;
-                               classValue.prototype instanceof this);
+               isSubclass(classValue) {
+                       return (typeof(classValue) == 'function' &amp;&amp; classValue.prototype instanceof this);
                },
 
                prototype: {
                         * and the values extracted from the `args` array beginning with
                         * `offset`.
                         */
-                       varargs: function(args, offset /*, ... */) {
-                               return Array.prototype.slice.call(arguments, 2)
-                                       .concat(Array.prototype.slice.call(args, offset));
+                       varargs(args, offset, ...extra_args) {
+                               return extra_args.concat(Array.prototype.slice.call(args, offset));
                        },
 
                        /**
                         * This function has two signatures and is sensitive to the
                         * amount of arguments passed to it:
                         *  - `super('key')` -
-                        *    Returns the value of `key` when found within one of the
-                        *    parent classes.
+                        *      Returns the value of `key` when found within one of the
+                        *      parent classes.
                         *  - `super('key', ['arg1', 'arg2'])` -
-                        *    Calls the `key()` method with parameters `arg1` and `arg2`
-                        *    when found within one of the parent classes.
+                        *      Calls the `key()` method with parameters `arg1` and `arg2`
+                        *      when found within one of the parent classes.
                         *
                         * @memberof LuCI.baseclass
                         * @instance
                         * was found in the parent class chain or when the call to the
                         * superclass method returned `null`.
                         */
-                       super: function(key, callArgs) {
+                       super(key, ...callArgs) {
                                if (key == null)
                                        return null;
 
-                               var slotIdx = this.__id__ + '.' + key,
-                                   symStack = superContext[slotIdx],
-                                   protoCtx = null;
+                               const slotIdx = `${this.__id__}.${key}`;
+                               const symStack = superContext[slotIdx];
+                               let protoCtx = null;
 
                                for (protoCtx = Object.getPrototypeOf(symStack ? symStack[0] : Object.getPrototypeOf(this));
-                                    protoCtx != null &amp;&amp; !protoCtx.hasOwnProperty(key);
-                                    protoCtx = Object.getPrototypeOf(protoCtx)) {}
+                                        protoCtx != null &amp;&amp; !protoCtx.hasOwnProperty(key);
+                                        protoCtx = Object.getPrototypeOf(protoCtx)) {}
 
                                if (protoCtx == null)
                                        return null;
 
-                               var res = protoCtx[key];
+                               let res = protoCtx[key];
 
-                               if (arguments.length > 1) {
+                               if (callArgs.length > 0) {
                                        if (typeof(res) != 'function')
-                                               throw new ReferenceError(key + ' is not a function in base class');
+                                               throw new ReferenceError(`${key} is not a function in base class`);
 
-                                       if (typeof(callArgs) != 'object')
-                                               callArgs = this.varargs(arguments, 1);
+                                       if (Array.isArray(callArgs[0]) || LuCI.prototype.isArguments(callArgs[0]))
+                                               callArgs = callArgs[0];
 
                                        if (symStack)
                                                symStack.unshift(protoCtx);
                         * constructor functions `displayName` and describing the class
                         * members and their respective types.
                         */
-                       toString: function() {
-                               var s = '[' + this.constructor.displayName + ']', f = true;
-                               for (var k in this) {
+                       toString() {
+                               let s = `[${this.constructor.displayName}]`, f = true;
+                               for (const k in this) {
                                        if (this.hasOwnProperty(k)) {
-                                               s += (f ? ' {\n' : '') + '  ' + k + ': ' + typeof(this[k]) + '\n';
+                                               s += `${f ? ' {\n' : ''}  ${k}: ${typeof(this[k])}\n`;
                                                f = false;
                                        }
                                }
         * The `Headers` class is an internal utility class exposed in HTTP
         * response objects using the `response.headers` property.
         */
-       var Headers = Class.extend(/** @lends LuCI.headers.prototype */ {
+       const Headers = Class.extend(/** @lends LuCI.headers.prototype */ {
                __name__: 'LuCI.headers',
-               __init__: function(xhr) {
-                       var hdrs = this.headers = {};
-                       xhr.getAllResponseHeaders().split(/\r\n/).forEach(function(line) {
-                               var m = /^([^:]+):(.*)$/.exec(line);
+               __init__(xhr) {
+                       const hdrs = this.headers = {};
+                       xhr.getAllResponseHeaders().split(/\r\n/).forEach(line => {
+                               const m = /^([^:]+):(.*)$/.exec(line);
                                if (m != null)
                                        hdrs[m[1].trim().toLowerCase()] = m[2].trim();
                        });
                 * @returns {boolean}
                 * Returns `true` if the header name is present, `false` otherwise
                 */
-               has: function(name) {
+               has(name) {
                        return this.headers.hasOwnProperty(String(name).toLowerCase());
                },
 
                 * @returns {string|null}
                 * The value of the given header name or `null` if the header isn't present.
                 */
-               get: function(name) {
-                       var key = String(name).toLowerCase();
+               get(name) {
+                       const key = String(name).toLowerCase();
                        return this.headers.hasOwnProperty(key) ? this.headers[key] : null;
                }
        });
         *
         * The `Response` class is an internal utility class representing HTTP responses.
         */
-       var Response = Class.extend({
+       const Response = Class.extend({
                __name__: 'LuCI.response',
-               __init__: function(xhr, url, duration, headers, content) {
+               __init__(xhr, url, duration, headers, content) {
                        /**
                         * Describes whether the response is successful (status codes `200..299`) or not
                         * @instance
                 * @returns {LuCI.response}
                 * The cloned `Response` instance.
                 */
-               clone: function(content) {
-                       var copy = new Response(this.xhr, this.url, this.duration, this.headers, content);
+               clone(content) {
+                       const copy = new Response(this.xhr, this.url, this.duration, this.headers, content);
 
                        copy.ok = this.ok;
                        copy.status = this.status;
                 * @returns {*}
                 * The parsed JSON data.
                 */
-               json: function() {
+               json() {
                        if (this.responseJSON == null)
                                this.responseJSON = JSON.parse(this.responseText);
 
                 * @returns {string}
                 * The response content.
                 */
-               text: function() {
+               text() {
                        if (this.responseText == null &amp;&amp; this.responseJSON != null)
                                this.responseText = JSON.stringify(this.responseJSON);
 
                 * @returns {Blob}
                 * The response content as blob.
                 */
-               blob: function() {
+               blob() {
                        return this.responseBlob;
                }
        });
 
 
-       var requestQueue = [];
+       const requestQueue = [];
 
        function isQueueableRequest(opt) {
                if (!classes.rpc)
                if (opt.nobatch === true)
                        return false;
 
-               var rpcBaseURL = Request.expandURL(classes.rpc.getBaseURL());
+               const rpcBaseURL = Request.expandURL(classes.rpc.getBaseURL());
 
                return (rpcBaseURL != null &amp;&amp; opt.url.indexOf(rpcBaseURL) == 0);
        }
                if (!requestQueue.length)
                        return;
 
-               var reqopt = Object.assign({}, requestQueue[0][0], { content: [], nobatch: true }),
-                   batch = [];
+               const reqopt = Object.assign({}, requestQueue[0][0], { content: [], nobatch: true }), batch = [];
 
-               for (var i = 0; i &lt; requestQueue.length; i++) {
+               for (let i = 0; i &lt; requestQueue.length; i++) {
                        batch[i] = requestQueue[i];
                        reqopt.content[i] = batch[i][0].content;
                }
 
                requestQueue.length = 0;
 
-               Request.request(rpcBaseURL, reqopt).then(function(reply) {
-                       var json = null, req = null;
+               Request.request(rpcBaseURL, reqopt).then(reply => {
+                       let json = null, req = null;
 
                        try { json = reply.json() }
                        catch(e) { }
                                        req[2].call(reqopt, reply.clone(json.shift()));
                                else
                                        req[1].call(reqopt, new Error('No related RPC reply'));
-               }).catch(function(error) {
-                       var req = null;
+               }).catch(error => {
+                       let req = null;
 
                        while ((req = batch.shift()) != null)
                                req[1].call(reqopt, error);
         * The `Request` class allows initiating HTTP requests and provides utilities
         * for dealing with responses.
         */
-       var Request = Class.singleton(/** @lends LuCI.request.prototype */ {
+       const Request = Class.singleton(/** @lends LuCI.request.prototype */ {
                __name__: 'LuCI.request',
 
                interceptors: [],
                 * The absolute URL derived from the given one, or the original URL
                 * if it already was absolute.
                 */
-               expandURL: function(url) {
+               expandURL(url) {
                        if (!/^(?:[^/]+:)?\/\//.test(url))
-                               url = location.protocol + '//' + location.host + url;
+                               url = `${location.protocol}//${location.host}${url}`;
 
                        return url;
                },
                 * @returns {Promise&lt;LuCI.response>}
                 * The resulting HTTP response.
                 */
-               request: function(target, options) {
-                       return Promise.resolve(target).then((function(url) {
-                               var state = { xhr: new XMLHttpRequest(), url: this.expandURL(url), start: Date.now() },
-                                   opt = Object.assign({}, options, state),
-                                   content = null,
-                                   contenttype = null,
-                                   callback = this.handleReadyStateChange;
-
-                               return new Promise(function(resolveFn, rejectFn) {
+               request(target, options) {
+                       return Promise.resolve(target).then(url => {
+                               const state = { xhr: new XMLHttpRequest(), url: this.expandURL(url), start: Date.now() };
+                               const opt = Object.assign({}, options, state);
+                               let content = null;
+                               let contenttype = null;
+                               const callback = this.handleReadyStateChange;
+
+                               return new Promise((resolveFn, rejectFn) => {
                                        opt.xhr.onreadystatechange = callback.bind(opt, resolveFn, rejectFn);
-                                       opt.method = String(opt.method || 'GET').toUpperCase();
+                                       opt.method = String(opt.method ?? 'GET').toUpperCase();
 
                                        if ('query' in opt) {
-                                               var q = (opt.query != null) ? Object.keys(opt.query).map(function(k) {
+                                               const q = (opt.query != null) ? Object.keys(opt.query).map(k => {
                                                        if (opt.query[k] != null) {
-                                                               var v = (typeof(opt.query[k]) == 'object')
+                                                               const v = (typeof(opt.query[k]) == 'object')
                                                                        ? JSON.stringify(opt.query[k])
                                                                        : String(opt.query[k]);
 
                                        else
                                                opt.xhr.open(opt.method, opt.url, true);
 
-                                       opt.xhr.responseType = opt.responseType || 'text';
+                                       opt.xhr.responseType = opt.responseType ?? 'text';
 
                                        if ('overrideMimeType' in opt.xhr)
                                                opt.xhr.overrideMimeType('application/octet-stream');
                                        }
 
                                        if ('headers' in opt)
-                                               for (var header in opt.headers)
+                                               for (const header in opt.headers)
                                                        if (opt.headers.hasOwnProperty(header)) {
                                                                if (header.toLowerCase() != 'content-type')
                                                                        opt.xhr.setRequestHeader(header, opt.headers[header]);
                                                rejectFn.call(opt, e);
                                        }
                                });
-                       }).bind(this));
+                       });
                },
 
-               handleReadyStateChange: function(resolveFn, rejectFn, ev) {
-                       var xhr = this.xhr,
-                           duration = Date.now() - this.start;
+               handleReadyStateChange(resolveFn, rejectFn, ev) {
+                       const xhr = this.xhr, duration = Date.now() - this.start;
 
                        if (xhr.readyState !== 4)
                                return;
                                        rejectFn.call(this, new Error('XHR request aborted by browser'));
                        }
                        else {
-                               var response = new Response(
-                                       xhr, xhr.responseURL || this.url, duration);
+                               const response = new Response(
+                                       xhr, xhr.responseURL ?? this.url, duration);
 
-                               Promise.all(Request.interceptors.map(function(fn) { return fn(response) }))
+                               Promise.all(Request.interceptors.map(fn => fn(response)))
                                        .then(resolveFn.bind(this, response))
                                        .catch(rejectFn.bind(this));
                        }
                 * @returns {Promise&lt;LuCI.response>}
                 * The resulting HTTP response.
                 */
-               get: function(url, options) {
+               get(url, options) {
                        return this.request(url, Object.assign({ method: 'GET' }, options));
                },
 
                 * @returns {Promise&lt;LuCI.response>}
                 * The resulting HTTP response.
                 */
-               post: function(url, data, options) {
+               post(url, data, options) {
                        return this.request(url, Object.assign({ method: 'POST', content: data }, options));
                },
 
                 * @returns {LuCI.request.interceptorFn}
                 * The registered function.
                 */
-               addInterceptor: function(interceptorFn) {
+               addInterceptor(interceptorFn) {
                        if (typeof(interceptorFn) == 'function')
                                this.interceptors.push(interceptorFn);
                        return interceptorFn;
                 * @returns {boolean}
                 * Returns `true` if any function has been removed, else `false`.
                 */
-               removeInterceptor: function(interceptorFn) {
-                       var oldlen = this.interceptors.length, i = oldlen;
+               removeInterceptor(interceptorFn) {
+                       const oldlen = this.interceptors.length;
+                       let i = oldlen;
                        while (i--)
                                if (this.interceptors[i] === interceptorFn)
                                        this.interceptors.splice(i, 1);
                         * @returns {function}
                         * Returns the internally created poll function.
                         */
-                       add: function(interval, url, options, callback) {
+                       add(interval, url, options, callback) {
                                if (isNaN(interval) || interval &lt;= 0)
                                        throw new TypeError('Invalid poll interval');
 
-                               var ival = interval >>> 0,
-                                   opts = Object.assign({}, options, { timeout: ival * 1000 - 5 });
+                               const ival = interval >>> 0, opts = Object.assign({}, options, { timeout: ival * 1000 - 5 });
 
-                               var fn = function() {
-                                       return Request.request(url, opts).then(function(res) {
-                                               if (!Poll.active())
-                                                       return;
+                               const fn = () => Request.request(url, opts).then(res => {
+                                       if (!Poll.active())
+                                               return;
 
-                                               var res_json = null;
-                                               try {
-                                                       res_json = res.json();
-                                               }
-                                               catch (err) {}
+                                       let res_json = null;
+                                       try {
+                                               res_json = res.json();
+                                       }
+                                       catch (err) {}
 
-                                               callback(res, res_json, res.duration);
-                                       });
-                               };
+                                       callback(res, res_json, res.duration);
+                               });
 
                                return (Poll.add(fn, ival) ? fn : null);
                        },
                         * @returns {boolean}
                         * Returns `true` if any function has been removed, else `false`.
                         */
-                       remove: function(entry) { return Poll.remove(entry) },
+                       remove(entry) { return Poll.remove(entry) },
 
                        /**
                          * Alias for {@link LuCI.poll.start LuCI.poll.start()}.
                          * @instance
                          * @memberof LuCI.request.poll
                          */
-                       start: function() { return Poll.start() },
+                       start() { return Poll.start() },
 
                        /**
                          * Alias for {@link LuCI.poll.stop LuCI.poll.stop()}.
                          * @instance
                          * @memberof LuCI.request.poll
                          */
-                       stop: function() { return Poll.stop() },
+                       stop() { return Poll.stop() },
 
                        /**
                          * Alias for {@link LuCI.poll.active LuCI.poll.active()}.
                          * @instance
                          * @memberof LuCI.request.poll
                          */
-                       active: function() { return Poll.active() }
+                       active() { return Poll.active() }
                }
        });
 
         * as well as starting, stopping and querying the state of the polling
         * loop.
         */
-       var Poll = Class.singleton(/** @lends LuCI.poll.prototype */ {
+       const Poll = Class.singleton(/** @lends LuCI.poll.prototype */ {
                __name__: 'LuCI.poll',
 
                queue: [],
                 * Returns `true` if the function has been added or `false` if it
                 * already is registered.
                 */
-               add: function(fn, interval) {
+               add(fn, interval) {
                        if (interval == null || interval &lt;= 0)
                                interval = env.pollinterval || null;
 
                        if (isNaN(interval) || typeof(fn) != 'function')
                                throw new TypeError('Invalid argument to LuCI.poll.add()');
 
-                       for (var i = 0; i &lt; this.queue.length; i++)
+                       for (let i = 0; i &lt; this.queue.length; i++)
                                if (this.queue[i].fn === fn)
                                        return false;
 
-                       var e = {
+                       const e = {
                                r: true,
                                i: interval >>> 0,
-                               fn: fn
+                               fn
                        };
 
                        this.queue.push(e);
                 * Returns `true` if the function has been removed or `false` if it
                 * wasn't found.
                 */
-               remove: function(fn) {
+               remove(fn) {
                        if (typeof(fn) != 'function')
                                throw new TypeError('Invalid argument to LuCI.poll.remove()');
 
-                       var len = this.queue.length;
+                       const len = this.queue.length;
 
-                       for (var i = len; i > 0; i--)
+                       for (let i = len; i > 0; i--)
                                if (this.queue[i-1].fn === fn)
                                        this.queue.splice(i-1, 1);
 
                 * Returns `true` if polling has been started (or if no functions
                 * where registered) or `false` when the polling loop already runs.
                 */
-               start: function() {
+               start() {
                        if (this.active())
                                return false;
 
                 * Returns `true` if polling has been stopped or `false` if it didn't
                 * run to begin with.
                 */
-               stop: function() {
+               stop() {
                        if (!this.active())
                                return false;
 
                },
 
                /* private */
-               step: function() {
-                       for (var i = 0, e = null; (e = Poll.queue[i]) != null; i++) {
+               step() {
+                       for (let i = 0, e = null; (e = Poll.queue[i]) != null; i++) {
                                if ((Poll.tick % e.i) != 0)
                                        continue;
 
                 * @memberof LuCI.poll
                 * @returns {boolean} - Returns `true` if polling is active, else `false`.
                 */
-               active: function() {
+               active() {
                        return (this.timer != null);
                }
        });
         * To import the class in views, use `'require dom'`, to import it in
         * external JavaScript, use `L.require("dom").then(...)`.
         */
-       var DOM = Class.singleton(/** @lends LuCI.dom.prototype */ {
+       const DOM = Class.singleton(/** @lends LuCI.dom.prototype */ {
                __name__: 'LuCI.dom',
 
                /**
                 * @returns {boolean}
                 * Returns `true` if the value is a DOM `Node`, else `false`.
                 */
-               elem: function(e) {
+               elem(e) {
                        return (e != null &amp;&amp; typeof(e) == 'object' &amp;&amp; 'nodeType' in e);
                },
 
                 * Returns the first DOM `Node` extracted from the HTML fragment or
                 * `null` on parsing failures or if no element could be found.
                 */
-               parse: function(s) {
-                       var elem = null;
-
+               parse(s) {
                        try {
-                               domParser = domParser || new DOMParser();
-                               elem = domParser.parseFromString(s, 'text/html').body.firstChild;
+                               return domParser.parseFromString(s, 'text/html').body.firstChild;
+                       }
+                       catch(e) {
+                               return null;
                        }
-                       catch(e) {}
-
-                       return elem;
                },
 
                /**
                 * or `false` when the node argument is no valid DOM `Node` or the
                 * selector didn't match.
                 */
-               matches: function(node, selector) {
-                       var m = this.elem(node) ? node.matches || node.msMatchesSelector : null;
+               matches(node, selector) {
+                       const m = this.elem(node) ? (node.matches ?? node.msMatchesSelector) : null;
                        return m ? m.call(node, selector) : false;
                },
 
                 * `null` when the node argument is no valid DOM `Node` or the
                 * selector didn't match any parent.
                 */
-               parent: function(node, selector) {
+               parent(node, selector) {
                        if (this.elem(node) &amp;&amp; node.closest)
                                return node.closest(selector);
 
                 * if either the `node` argument was no valid DOM `node` or if the
                 * `children` was `null` or didn't result in further DOM nodes.
                 */
-               append: function(node, children) {
+               append(node, children) {
                        if (!this.elem(node))
                                return null;
 
                        if (Array.isArray(children)) {
-                               for (var i = 0; i &lt; children.length; i++)
+                               for (let i = 0; i &lt; children.length; i++)
                                        if (this.elem(children[i]))
                                                node.appendChild(children[i]);
                                        else if (children !== null &amp;&amp; children !== undefined)
-                                               node.appendChild(document.createTextNode('' + children[i]));
+                                               node.appendChild(document.createTextNode(`${children[i]}`));
 
                                return node.lastChild;
                        }
                                return node.appendChild(children);
                        }
                        else if (children !== null &amp;&amp; children !== undefined) {
-                               node.innerHTML = '' + children;
+                               node.innerHTML = `${children}`;
                                return node.lastChild;
                        }
 
                 * if either the `node` argument was no valid DOM `node` or if the
                 * `children` was `null` or didn't result in further DOM nodes.
                 */
-               content: function(node, children) {
+               content(node, children) {
                        if (!this.elem(node))
                                return null;
 
-                       var dataNodes = node.querySelectorAll('[data-idref]');
+                       const dataNodes = node.querySelectorAll('[data-idref]');
 
-                       for (var i = 0; i &lt; dataNodes.length; i++)
+                       for (let i = 0; i &lt; dataNodes.length; i++)
                                delete this.registry[dataNodes[i].getAttribute('data-idref')];
 
                        while (node.firstChild)
                 * to the given `node` as-is, with the underlying `setAttribute()`
                 * call implicitly turning it into a string.
                 */
-               attr: function(node, key, val) {
+               attr(node, key, val) {
                        if (!this.elem(node))
                                return null;
 
-                       var attr = null;
+                       let attr = null;
 
                        if (typeof(key) === 'object' &amp;&amp; key !== null)
                                attr = key;
                 * @returns {Node}
                 * Returns the newly created `Node`.
                 */
-               create: function() {
-                       var html = arguments[0],
-                           attr = arguments[1],
-                           data = arguments[2],
-                           elem;
+               create() {
+                       const html = arguments[0];
+                       let attr = arguments[1];
+                       let data = arguments[2];
+                       let elem;
 
                        if (!(attr instanceof Object) || Array.isArray(attr))
                                data = attr, attr = null;
 
                        if (Array.isArray(html)) {
                                elem = document.createDocumentFragment();
-                               for (var i = 0; i &lt; html.length; i++)
+                               for (let i = 0; i &lt; html.length; i++)
                                        elem.appendChild(this.create(html[i]));
                        }
                        else if (this.elem(html)) {
                 * number of arguments passed to it.
                 *
                 *  - `dom.data(node)` -
-                *     Fetches all data associated with the given node.
+                *       Fetches all data associated with the given node.
                 *  - `dom.data(node, key)` -
-                *     Fetches a specific key associated with the given node.
+                *       Fetches a specific key associated with the given node.
                 *  - `dom.data(node, key, val)` -
-                *     Sets a specific key to the given value associated with the
-                *     given node.
+                *       Sets a specific key to the given value associated with the
+                *       given node.
                 *  - `dom.data(node, null)` -
-                *     Clears any data associated with the node.
+                *       Clears any data associated with the node.
                 *  - `dom.data(node, key, null)` -
-                *     Clears the given key associated with the node.
+                *       Clears the given key associated with the node.
                 *
                 * @instance
                 * @memberof LuCI.dom
                 * Returns the get or set value, or `null` when no value could
                 * be found.
                 */
-               data: function(node, key, val) {
-                       if (!node || !node.getAttribute)
+               data(node, key, val) {
+                       if (!node?.getAttribute)
                                return null;
 
-                       var id = node.getAttribute('data-idref');
+                       let id = node.getAttribute('data-idref');
 
                        /* clear all data */
                        if (arguments.length > 1 &amp;&amp; key == null) {
                 * @returns {Class}
                 * Returns the bound class instance.
                 */
-               bindClassInstance: function(node, inst) {
+               bindClassInstance(node, inst) {
                        if (!(inst instanceof Class))
                                LuCI.prototype.error('TypeError', 'Argument must be a class instance');
 
                 * Returns the founds class instance if any or `null` if no bound
                 * class could be found on the node itself or any of its parents.
                 */
-               findClassInstance: function(node) {
-                       var inst = null;
+               findClassInstance(node) {
+                       let inst = null;
 
                        do {
                                inst = this.data(node, '_class');
                 * no bound class instance could be found, or if the found
                 * instance didn't have the requested `method`.
                 */
-               callClassMethod: function(node, method /*, ... */) {
-                       var inst = this.findClassInstance(node);
+               callClassMethod(node, method, ...args) {
+                       const inst = this.findClassInstance(node);
 
-                       if (inst == null || typeof(inst[method]) != 'function')
+                       if (typeof(inst?.[method]) != 'function')
                                return null;
 
-                       return inst[method].apply(inst, inst.varargs(arguments, 2));
+                       return inst[method].call(inst, ...args);
                },
 
                /**
                 * any children node either has a `hidden` CSS class or a `false`
                 * result when testing it using the given `ignoreFn`.
                 */
-               isEmpty: function(node, ignoreFn) {
-                       for (var child = node.firstElementChild; child != null; child = child.nextElementSibling)
-                               if (!child.classList.contains('hidden') &amp;&amp; (!ignoreFn || !ignoreFn(child)))
+               isEmpty(node, ignoreFn) {
+                       for (let child = node?.firstElementChild; child != null; child = child.nextElementSibling)
+                               if (!child.classList.contains('hidden') &amp;&amp; !ignoreFn?.(child))
                                        return false;
 
                        return true;
         *
         * The `session` class provides various session related functionality.
         */
-       var Session = Class.singleton(/** @lends LuCI.session.prototype */ {
+       const Session = Class.singleton(/** @lends LuCI.session.prototype */ {
                __name__: 'LuCI.session',
 
                /**
                 * @returns {string}
                 * Returns the current session ID.
                 */
-               getID: function() {
-                       return env.sessionid || '00000000000000000000000000000000';
+               getID() {
+                       return env.sessionid ?? '00000000000000000000000000000000';
                },
 
                /**
                 * @returns {string|null}
                 * Returns the current session token or `null` if not logged in.
                 */
-               getToken: function() {
-                       return env.token || null;
+               getToken() {
+                       return env.token ?? null;
                },
 
                /**
                 * Returns the stored session data or `null` if the given key wasn't
                 * found.
                 */
-               getLocalData: function(key) {
+               getLocalData(key) {
                        try {
-                               var sid = this.getID(),
-                                   item = 'luci-session-store',
-                                   data = JSON.parse(window.sessionStorage.getItem(item));
+                               const sid = this.getID();
+                               const item = 'luci-session-store';
+                               let data = JSON.parse(window.sessionStorage.getItem(item));
 
                                if (!LuCI.prototype.isObject(data) || !data.hasOwnProperty(sid)) {
                                        data = {};
                 * @returns {boolean}
                 * Returns `true` if the data could be stored or `false` on error.
                 */
-               setLocalData: function(key, value) {
+               setLocalData(key, value) {
                        if (key == null)
                                return false;
 
                        try {
-                               var sid = this.getID(),
-                                   item = 'luci-session-store',
-                                   data = JSON.parse(window.sessionStorage.getItem(item));
+                               const sid = this.getID();
+                               const item = 'luci-session-store';
+                               let data = JSON.parse(window.sessionStorage.getItem(item));
 
                                if (!LuCI.prototype.isObject(data) || !data.hasOwnProperty(sid)) {
                                        data = {};
         * The `view` class forms the basis of views and provides a standard
         * set of methods to inherit from.
         */
-       var View = Class.extend(/** @lends LuCI.view.prototype */ {
+       const View = Class.extend(/** @lends LuCI.view.prototype */ {
                __name__: 'LuCI.view',
 
-               __init__: function() {
-                       var vp = document.getElementById('view');
+               __init__() {
+                       const vp = document.getElementById('view');
 
                        DOM.content(vp, E('div', { 'class': 'spinning' }, _('Loading view…')));
 
                        return Promise.resolve(this.load())
                                .then(LuCI.prototype.bind(this.render, this))
                                .then(LuCI.prototype.bind(function(nodes) {
-                                       var vp = document.getElementById('view');
+                                       const vp = document.getElementById('view');
 
                                        DOM.content(vp, nodes);
                                        DOM.append(vp, this.addFooter());
                 * @returns {*|Promise&lt;*>}
                 * May return any value or a Promise resolving to any value.
                 */
-               load: function() {},
+               load() {},
 
                /**
                 * The render function is invoked after the
                 * Should return a DOM `Node` value or a `Promise` resolving
                 * to a `Node` value.
                 */
-               render: function() {},
+               render() {},
 
                /**
                 * The handleSave function is invoked when the user clicks
                 * returned promise runs to completion before the button
                 * is re-enabled.
                 */
-               handleSave: function(ev) {
-                       var tasks = [];
+               handleSave(ev) {
+                       const tasks = [];
 
                        document.getElementById('maincontent')
-                               .querySelectorAll('.cbi-map').forEach(function(map) {
+                               .querySelectorAll('.cbi-map').forEach(map => {
                                        tasks.push(DOM.callClassMethod(map, 'save'));
                                });
 
                 * returned promise runs to completion before the button
                 * is re-enabled.
                 */
-               handleSaveApply: function(ev, mode) {
-                       return this.handleSave(ev).then(function() {
+               handleSaveApply(ev, mode) {
+                       return this.handleSave(ev).then(() => {
                                classes.ui.changes.apply(mode == '0');
                        });
                },
                 * returned promise runs to completion before the button
                 * is re-enabled.
                 */
-               handleReset: function(ev) {
-                       var tasks = [];
+               handleReset(ev) {
+                       const tasks = [];
 
                        document.getElementById('maincontent')
-                               .querySelectorAll('.cbi-map').forEach(function(map) {
+                               .querySelectorAll('.cbi-map').forEach(map => {
                                        tasks.push(DOM.callClassMethod(map, 'reset'));
                                });
 
                 * or an empty `DocumentFragment` if all three `handle*()`
                 * methods are overwritten with `null`.
                 */
-               addFooter: function() {
-                       var footer = E([]),
-                           vp = document.getElementById('view'),
-                           hasmap = false,
-                           readonly = true;
-
-                       vp.querySelectorAll('.cbi-map').forEach(function(map) {
-                               var m = DOM.findClassInstance(map);
+               addFooter() {
+                       const footer = E([]);
+                       const vp = document.getElementById('view');
+                       let hasmap = false;
+                       let readonly = true;
+
+                       vp.querySelectorAll('.cbi-map').forEach(map => {
+                               const m = DOM.findClassInstance(map);
                                if (m) {
                                        hasmap = true;
 
                        if (!hasmap)
                                readonly = !LuCI.prototype.hasViewPermission();
 
-                       var saveApplyBtn = this.handleSaveApply ? new classes.ui.ComboButton('0', {
+                       const saveApplyBtn = this.handleSaveApply ? new classes.ui.ComboButton('0', {
                                0: [ _('Save &amp; Apply') ],
                                1: [ _('Apply unchecked') ]
                        }, {
        });
 
 
-       var dummyElem = null,
-           domParser = null,
-           originalCBIInit = null,
-           rpcBaseURL = null,
-           sysFeatures = null,
-           preloadClasses = null;
+       const domParser = new DOMParser();
+       let originalCBIInit = null;
+       let rpcBaseURL = null;
+       let sysFeatures = null;
+       let preloadClasses = null;
 
        /* "preload" builtin classes to make the available via require */
-       var classes = {
+       const classes = {
                baseclass: Class,
                dom: DOM,
                poll: Poll,
                view: View
        };
 
-       var naturalCompare = new Intl.Collator(undefined, { numeric: true }).compare;
+       const naturalCompare = new Intl.Collator(undefined, { numeric: true }).compare;
 
-       var LuCI = Class.extend(/** @lends LuCI.prototype */ {
+       const LuCI = Class.extend(/** @lends LuCI.prototype */ {
                __name__: 'LuCI',
-               __init__: function(setenv) {
+               __init__(setenv) {
 
-                       document.querySelectorAll('script[src*="/luci.js"]').forEach(function(s) {
+                       document.querySelectorAll('script[src*="/luci.js"]').forEach(s => {
                                if (setenv.base_url == null || setenv.base_url == '') {
-                                       var m = (s.getAttribute('src') || '').match(/^(.*)\/luci\.js(?:\?v=([^?]+))?$/);
+                                       const m = (s.getAttribute('src') ?? '').match(/^(.*)\/luci\.js(?:\?v=([^?]+))?$/);
                                        if (m) {
                                                setenv.base_url = m[1];
                                                setenv.resource_version = m[2];
 
                        Object.assign(env, setenv);
 
-                       var domReady = new Promise(function(resolveFn, rejectFn) {
+                       const domReady = new Promise((resolveFn, rejectFn) => {
                                document.addEventListener('DOMContentLoaded', resolveFn);
                        });
 
                        ]).then(this.setupDOM.bind(this)).catch(this.error);
 
                        originalCBIInit = window.cbi_init;
-                       window.cbi_init = function() {};
+                       window.cbi_init = () => {};
                },
 
                /**
                 * appended to the message and the type set to the given type
                 * argument or copied from the given error instance.
                 */
-               raise: function(type, fmt /*, ...*/) {
-                       var e = null,
-                           msg = fmt ? String.prototype.format.apply(fmt, this.varargs(arguments, 2)) : null,
-                           stack = null;
+               raise(type, fmt, ...args) {
+                       let e = null;
+                       const msg = fmt ? String.prototype.format.call(fmt, ...args) : null;
+                       const stack = [];
 
                        if (type instanceof Error) {
                                e = type;
 
                                if (msg)
-                                       e.message = msg + ': ' + e.message;
+                                       e.message = `${msg}: ${e.message}`;
                        }
                        else {
                                try { throw new Error('stacktrace') }
-                               catch (e2) { stack = (e2.stack || '').split(/\n/) }
+                               catch (e2) { stack.push(...(e2.stack ?? '').split(/\n/)) }
 
-                               e = new (window[type || 'Error'] || Error)(msg || 'Unspecified error');
-                               e.name = type || 'Error';
+                               e = new (window[type ?? 'Error'] ?? Error)(msg ?? 'Unspecified error');
+                               e.name = type ?? 'Error';
                        }
 
-                       stack = (stack || []).map(function(frame) {
-                               frame = frame.replace(/(.*?)@(.+):(\d+):(\d+)/g, 'at $1 ($2:$3:$4)').trim();
-                               return frame ? '  ' + frame : '';
-                       });
+                       for (let i = 0; i &lt; stack.length; i++) {
+                               const frame = stack[i].replace(/(.*?)@(.+):(\d+):(\d+)/g, 'at $1 ($2:$3:$4)').trim();
+                               stack[i] = frame ? `  ${frame}` : '';
+                       }
 
                        if (!/^  at /.test(stack[0]))
                                stack.shift();
                                stack.shift();
 
                        if (stack.length)
-                               e.message += '\n' + stack.join('\n');
+                               e.message += `\n${stack.join('\n')}`;
 
                        if (window.console &amp;&amp; console.debug)
                                console.debug(e);
                 * appended to the message and the type set to the given type
                 * argument or copied from the given error instance.
                 */
-               error: function(type, fmt /*, ...*/) {
+               error(type, fmt /*, ...*/) {
                        try {
                                LuCI.prototype.raise.apply(LuCI.prototype,
                                        Array.prototype.slice.call(arguments));
                 * @returns {function}
                 * Returns the bound function.
                 */
-               bind: function(fn, self /*, ... */) {
-                       return Function.prototype.bind.apply(fn, this.varargs(arguments, 2, self));
+               bind(fn, self, ...args) {
+                       return Function.prototype.bind.call(fn, self, ...args);
                },
 
                /**
                 * @returns {Promise&lt;LuCI.baseclass>}
                 * Returns the instantiated class.
                 */
-               require: function(name, from) {
-                       var L = this, url = null, from = from || [];
+               require(name, from = []) {
+                       const L = this;
+                       let url = null;
 
                        /* Class already loaded */
                        if (classes[name] != null) {
                                return Promise.resolve(classes[name]);
                        }
 
-                       url = '%s/%s.js%s'.format(env.base_url, name.replace(/\./g, '/'), (env.resource_version ? '?v=' + env.resource_version : ''));
+                       url = '%s/%s.js%s'.format(env.base_url, name.replace(/\./g, '/'), (env.resource_version ? `?v=${env.resource_version}` : ''));
                        from = [ name ].concat(from);
 
-                       var compileClass = function(res) {
+                       const compileClass = res => {
                                if (!res.ok)
                                        LuCI.prototype.raise('NetworkError',
                                                'HTTP error %d while loading class file "%s"', res.status, url);
 
-                               var source = res.text(),
-                                   requirematch = /^require[ \t]+(\S+)(?:[ \t]+as[ \t]+([a-zA-Z_]\S*))?$/,
-                                   strictmatch = /^use[ \t]+strict$/,
-                                   depends = [],
-                                   args = '';
+                               const source = res.text();
+                               const requirematch = /^require[ \t]+(\S+)(?:[ \t]+as[ \t]+([a-zA-Z_]\S*))?$/;
+                               const strictmatch = /^use[ \t]+strict$/;
+                               const depends = [];
+                               let args = '';
 
                                /* find require statements in source */
-                               for (var i = 0, off = -1, prev = -1, quote = -1, comment = -1, esc = false; i &lt; source.length; i++) {
-                                       var chr = source.charCodeAt(i);
+                               for (let i = 0, off = -1, prev = -1, quote = -1, comment = -1, esc = false; i &lt; source.length; i++) {
+                                       const chr = source.charCodeAt(i);
 
                                        if (esc) {
                                                esc = false;
                                                esc = true;
                                        }
                                        else if (chr == quote) {
-                                               var s = source.substring(off, i),
-                                                   m = requirematch.exec(s);
+                                               const s = source.substring(off, i), m = requirematch.exec(s);
 
                                                if (m) {
-                                                       var dep = m[1], as = m[2] || dep.replace(/[^a-zA-Z0-9_]/g, '_');
+                                                       const dep = m[1], as = m[2] || dep.replace(/[^a-zA-Z0-9_]/g, '_');
                                                        depends.push(LuCI.prototype.require(dep, from));
-                                                       args += ', ' + as;
+                                                       args += `, ${as}`;
                                                }
                                                else if (!strictmatch.exec(s)) {
                                                        break;
                                }
 
                                /* load dependencies and instantiate class */
-                               return Promise.all(depends).then(function(instances) {
-                                       var _factory, _class;
+                               return Promise.all(depends).then(instances => {
+                                       let _factory, _class;
 
                                        try {
                                                _factory = eval(
                                        }
                                        catch (error) {
                                                LuCI.prototype.raise('SyntaxError', '%s\n  in %s:%s',
-                                                       error.message, res.url, error.lineNumber || '?');
+                                                       error.message, res.url, error.lineNumber ?? '?');
                                        }
 
-                                       _factory.displayName = toCamelCase(name + 'ClassFactory');
+                                       _factory.displayName = toCamelCase(`${name}ClassFactory`);
                                        _class = _factory.apply(_factory, [window, document, L].concat(instances));
 
                                        if (!Class.isSubclass(_class))
-                                           LuCI.prototype.error('TypeError', '"%s" factory yields invalid constructor', name);
+                                               LuCI.prototype.error('TypeError', '"%s" factory yields invalid constructor', name);
 
                                        if (_class.displayName == 'AnonymousClass')
-                                               _class.displayName = toCamelCase(name + 'Class');
+                                               _class.displayName = toCamelCase(`${name}Class`);
 
-                                       var ptr = Object.getPrototypeOf(L),
-                                           parts = name.split(/\./),
-                                           instance = new _class();
+                                       let ptr = Object.getPrototypeOf(L);
+                                       let idx = 0;
+                                       const parts = name.split(/\./);
+                                       const instance = new _class();
 
-                                       for (var i = 0; ptr &amp;&amp; i &lt; parts.length - 1; i++)
-                                               ptr = ptr[parts[i]];
+                                       while (ptr &amp;&amp; idx &lt; parts.length - 1)
+                                               ptr = ptr[parts[idx++]];
 
                                        if (ptr)
-                                               ptr[parts[i]] = instance;
+                                               ptr[parts[idx]] = instance;
 
                                        classes[name] = instance;
 
                },
 
                /* DOM setup */
-               probeRPCBaseURL: function() {
+               probeRPCBaseURL() {
                        if (rpcBaseURL == null)
                                rpcBaseURL = Session.getLocalData('rpcBaseURL');
 
                        if (rpcBaseURL == null) {
-                               var msg = {
+                               const msg = {
                                        jsonrpc: '2.0',
-                                       id:      'init',
+                                       id:       'init',
                                        method:  'list',
                                        params:  undefined
                                };
-                               var rpcFallbackURL = this.url('admin/ubus');
+                               const rpcFallbackURL = this.url('admin/ubus');
 
-                               rpcBaseURL = Request.post(env.ubuspath, msg, { nobatch: true }).then(function(res) {
-                                       return (rpcBaseURL = res.status == 200 ? env.ubuspath : rpcFallbackURL);
-                               }, function() {
-                                       return (rpcBaseURL = rpcFallbackURL);
-                               }).then(function(url) {
+                               rpcBaseURL = Request.post(env.ubuspath, msg, { nobatch: true }).then(res => rpcBaseURL = res.status == 200 ? env.ubuspath : rpcFallbackURL, () => rpcBaseURL = rpcFallbackURL).then(url => {
                                        Session.setLocalData('rpcBaseURL', url);
                                        return url;
                                });
                        return Promise.resolve(rpcBaseURL);
                },
 
-               probeSystemFeatures: function() {
+               probeSystemFeatures() {
                        if (sysFeatures == null)
                                sysFeatures = Session.getLocalData('features');
 
                                        object: 'luci',
                                        method: 'getFeatures',
                                        expect: { '': {} }
-                               })().then(function(features) {
+                               })().then(features => {
                                        Session.setLocalData('features', features);
                                        sysFeatures = features;
 
                        return Promise.resolve(sysFeatures);
                },
 
-               probePreloadClasses: function() {
+               probePreloadClasses() {
                        if (preloadClasses == null)
                                preloadClasses = Session.getLocalData('preload');
 
                                        method: 'list',
                                        params: [ 'path' ],
                                        expect: { 'entries': [] }
-                               })(this.fspath(this.resource('preload'))), []).then(function(entries) {
-                                       var classes = [];
+                               })(this.fspath(this.resource('preload'))), []).then(entries => {
+                                       const classes = [];
 
-                                       for (var i = 0; i &lt; entries.length; i++) {
+                                       for (let i = 0; i &lt; entries.length; i++) {
                                                if (entries[i].type != 'file')
                                                        continue;
 
-                                               var m = entries[i].name.match(/(.+)\.js$/);
+                                               const m = entries[i].name.match(/(.+)\.js$/);
 
                                                if (m)
                                                        classes.push('preload.%s'.format(m[1]));
                 * Return `null` when a sub-feature was queried for a feature which
                 * has no sub-features.
                 */
-               hasSystemFeature: function() {
-                       var ft = sysFeatures[arguments[0]];
+               hasSystemFeature() {
+                       const ft = sysFeatures[arguments[0]];
 
                        if (arguments.length == 2)
                                return this.isObject(ft) ? ft[arguments[1]] : null;
                },
 
                /* private */
-               notifySessionExpiry: function() {
+               notifySessionExpiry() {
                        Poll.stop();
 
                        classes.ui.showModal(_('Session expired'), [
                                E('div', { class: 'right' },
                                        E('div', {
                                                class: 'btn primary',
-                                               click: function() {
-                                                       var loc = window.location;
-                                                       window.location = loc.protocol + '//' + loc.host + loc.pathname + loc.search;
+                                               click() {
+                                                       const loc = window.location;
+                                                       window.location = `${loc.protocol}//${loc.host}${loc.pathname}${loc.search}`;
                                                }
                                        }, _('Log in…')))
                        ]);
                },
 
                /* private */
-               setupDOM: function(res) {
-                       var domEv = res[0],
-                           uiClass = res[1],
-                           rpcClass = res[2],
-                           formClass = res[3],
-                           rpcBaseURL = res[4];
+               setupDOM(res) {
+                       const domEv = res[0], uiClass = res[1], rpcClass = res[2], formClass = res[3], rpcBaseURL = res[4];
 
                        rpcClass.setBaseURL(rpcBaseURL);
 
-                       rpcClass.addInterceptor(function(msg, req) {
+                       rpcClass.addInterceptor((msg, req) => {
                                if (!LuCI.prototype.isObject(msg) ||
-                                   !LuCI.prototype.isObject(msg.error) ||
-                                   msg.error.code != -32002)
+                                       !LuCI.prototype.isObject(msg.error) ||
+                                       msg.error.code != -32002)
                                        return;
 
                                if (!LuCI.prototype.isObject(req) ||
-                                   (req.object == 'session' &amp;&amp; req.method == 'access'))
+                                       (req.object == 'session' &amp;&amp; req.method == 'access'))
                                        return;
 
                                return rpcClass.declare({
                                })('uci', 'luci', 'read').catch(LuCI.prototype.notifySessionExpiry);
                        });
 
-                       Request.addInterceptor(function(res) {
-                               var isDenied = false;
+                       Request.addInterceptor(res => {
+                               let isDenied = false;
 
                                if (res.status == 403 &amp;&amp; res.headers.get('X-LuCI-Login-Required') == 'yes')
                                        isDenied = true;
                                LuCI.prototype.notifySessionExpiry();
                        });
 
-                       document.addEventListener('poll-start', function(ev) {
-                               uiClass.showIndicator('poll-status', _('Refreshing'), function(ev) {
+                       document.addEventListener('poll-start', ev => {
+                               uiClass.showIndicator('poll-status', _('Refreshing'), ev => {
                                        Request.poll.active() ? Request.poll.stop() : Request.poll.start();
                                });
                        });
 
-                       document.addEventListener('poll-stop', function(ev) {
+                       document.addEventListener('poll-stop', ev => {
                                uiClass.showIndicator('poll-status', _('Paused'), null, 'inactive');
                        });
 
                                this.probeSystemFeatures(),
                                this.probePreloadClasses()
                        ]).finally(LuCI.prototype.bind(function() {
-                               var tasks = [];
+                               const tasks = [];
 
                                if (Array.isArray(preloadClasses))
-                                       for (var i = 0; i &lt; preloadClasses.length; i++)
+                                       for (let i = 0; i &lt; preloadClasses.length; i++)
                                                tasks.push(this.require(preloadClasses[i]));
 
                                return Promise.all(tasks);
                },
 
                /* private */
-               initDOM: function() {
+               initDOM() {
                        originalCBIInit();
                        Poll.start();
                        document.dispatchEvent(new CustomEvent('luci-loaded'));
                 * @instance
                 * @memberof LuCI
                 */
-               env: env,
+               env,
 
                /**
                 * Construct an absolute filesystem path relative to the server
                 * @return {string}
                 * Return the joined path.
                 */
-               fspath: function(/* ... */) {
-                       var path = env.documentroot;
+               fspath() /* ... */{
+                       let path = env.documentroot;
 
-                       for (var i = 0; i &lt; arguments.length; i++)
-                               path += '/' + arguments[i];
+                       for (let i = 0; i &lt; arguments.length; i++)
+                               path += `/${arguments[i]}`;
 
-                       var p = path.replace(/\/+$/, '').replace(/\/+/g, '/').split(/\//),
-                           res = [];
+                       const p = path.replace(/\/+$/, '').replace(/\/+/g, '/').split(/\//), res = [];
 
-                       for (var i = 0; i &lt; p.length; i++)
+                       for (let i = 0; i &lt; p.length; i++)
                                if (p[i] == '..')
                                        res.pop();
                                else if (p[i] != '.')
                 * @return {string}
                 * Return the joined URL path.
                 */
-               path: function(prefix, parts) {
-                       var url = [ prefix || '' ];
+               path(prefix = '', parts) {
+                       const url = [ prefix ];
 
-                       for (var i = 0; i &lt; parts.length; i++)
+                       for (let i = 0; i &lt; parts.length; i++)
                                if (/^(?:[a-zA-Z0-9_.%,;-]+\/)*[a-zA-Z0-9_.%,;-]+$/.test(parts[i]) || /^\?[a-zA-Z0-9_.%=&amp;;-]+$/.test(parts[i]))
                                        url.push(parts[i].startsWith('?') ? parts[i] : '/' + parts[i]);
 
                 * @return {string}
                 * Returns the resulting URL path.
                 */
-               url: function() {
+               url() {
                        return this.path(env.scriptname, arguments);
                },
 
                 * @return {string}
                 * Returns the resulting URL path.
                 */
-               resource: function() {
+               resource() {
                        return this.path(env.resource, arguments);
                },
 
                 * @return {string}
                 * Returns the resulting URL path.
                 */
-               media: function() {
+               media() {
                        return this.path(env.media, arguments);
                },
 
                 * @return {string}
                 * Returns the URL path to the current view.
                 */
-               location: function() {
+               location() {
                        return this.path(env.scriptname, env.requestpath);
                },
 
                 * Returns `true` if the given value is of type object and
                 * not `null`, else returns `false`.
                 */
-               isObject: function(val) {
+               isObject(val) {
                        return (val != null &amp;&amp; typeof(val) == 'object');
                },
 
+               /**
+                * Tests whether the passed argument is a function arguments object.
+                *
+                * @instance
+                * @memberof LuCI
+                *
+                * @param {*} [val]
+                * The value to test
+                *
+                * @return {boolean}
+                * Returns `true` if the given value is a function arguments object,
+                * else returns `false`.
+                */
+               isArguments(val) {
+                       return (Object.prototype.toString.call(val) == '[object Arguments]');
+               },
+
                /**
                 * Return an array of sorted object keys, optionally sorted by
                 * a different key or a different sorting mode.
                 * @return {string[]}
                 * Returns an array containing the sorted keys of the given object.
                 */
-               sortedKeys: function(obj, key, sortmode) {
+               sortedKeys(obj, key, sortmode) {
                        if (obj == null || typeof(obj) != 'object')
                                return [];
 
-                       return Object.keys(obj).map(function(e) {
-                               var v = (key != null) ? obj[e][key] : e;
+                       return Object.keys(obj).map(e => {
+                               let v = (key != null) ? obj[e][key] : e;
 
                                switch (sortmode) {
                                case 'addr':
                                        v = (v != null) ? v.replace(/(?:^|[.:])([0-9a-fA-F]{1,4})/g,
-                                               function(m0, m1) { return ('000' + m1.toLowerCase()).substr(-4) }) : null;
+                                               (m0, m1) => (`000${m1.toLowerCase()}`).substr(-4)) : null;
                                        break;
 
                                case 'num':
                                }
 
                                return [ e, v ];
-                       }).filter(function(e) {
-                               return (e[1] != null);
-                       }).sort(function(a, b) {
-                               return naturalCompare(a[1], b[1]);
-                       }).map(function(e) {
-                               return e[0];
-                       });
+                       }).filter(e => e[1] != null).sort((a, b) => naturalCompare(a[1], b[1])).map(e => e[0]);
                },
 
                /**
                 * Returns 0 if both values are equal.
                 * Returns 1 if the first value is larger than the second one.
                 */
-               naturalCompare: naturalCompare,
+               naturalCompare,
 
                /**
                 * Converts the given value to an array using toArray() if needed,
                 * @return {Array&lt;*>}
                 * Returns the resulting, numerically sorted array.
                 */
-               sortedArray: function(val) {
+               sortedArray(val) {
                        return this.toArray(val).sort(naturalCompare);
                },
 
                 * @return {Array&lt;*>}
                 * Returns the resulting array.
                 */
-               toArray: function(val) {
+               toArray(val) {
                        if (val == null)
                                return [];
                        else if (Array.isArray(val))
                        else if (typeof(val) == 'object')
                                return [ val ];
 
-                       var s = String(val).trim();
+                       const s = String(val).trim();
 
                        if (s == '')
                                return [];
                 * Returns a new promise resolving either to the given input value or
                 * to the given default value on error.
                 */
-               resolveDefault: function(value, defvalue) {
-                       return Promise.resolve(value).catch(function() { return defvalue });
+               resolveDefault(value, defvalue) {
+                       return Promise.resolve(value).catch(() => defvalue);
                },
 
                /**
                 * @return {Promise&lt;null>}
                 * Returns a promise resolving to `null` when concluded.
                 */
-               get: function(url, args, cb) {
+               get(url, args, cb) {
                        return this.poll(null, url, args, cb, false);
                },
 
                 * @return {Promise&lt;null>}
                 * Returns a promise resolving to `null` when concluded.
                 */
-               post: function(url, args, cb) {
+               post(url, args, cb) {
                        return this.poll(null, url, args, cb, true);
                },
 
                 * be passed to {@link LuCI.poll.remove Poll.remove()} to remove the
                 * polling request.
                 */
-               poll: function(interval, url, args, cb, post) {
+               poll(interval, url, args, cb, post) {
                        if (interval !== null &amp;&amp; interval &lt;= 0)
                                interval = env.pollinterval;
 
-                       var data = post ? { token: env.token } : null,
-                           method = post ? 'POST' : 'GET';
+                       const data = Object.assign(post ? { token: env.token } : {}, args);
+                       const method = post ? 'POST' : 'GET';
 
                        if (!/^(?:\/|\S+:\/\/)/.test(url))
                                url = this.url(url);
 
-                       if (args != null)
-                               data = Object.assign(data || {}, args);
-
                        if (interval !== null)
-                               return Request.poll.add(interval, url, { method: method, query: data }, cb);
+                               return Request.poll.add(interval, url, { method, query: data }, cb);
                        else
-                               return Request.request(url, { method: method, query: data })
-                                       .then(function(res) {
-                                               var json = null;
+                               return Request.request(url, { method, query: data })
+                                       .then(res => {
+                                               let json = null;
                                                if (/^application\/json\b/.test(res.headers.get('Content-Type')))
                                                        try { json = res.json() } catch(e) {}
                                                cb(res.xhr, json, res.duration);
                 * permissions are granted or `true` if at least one required ACL
                 * group is granted with write permissions.
                 */
-               hasViewPermission: function() {
+               hasViewPermission() {
                        if (!this.isObject(env.nodespec) || !env.nodespec.satisfied)
-                           return null;
+                               return null;
 
                        return !env.nodespec.readonly;
                },
                 * Returns `true` when the function has been removed or `false` if
                 * it could not be found.
                 */
-               stop: function(entry) { return Poll.remove(entry) },
+               stop(entry) { return Poll.remove(entry) },
 
                /**
                 * Deprecated wrapper around {@link LuCI.poll.stop Poll.stop()}.
                 * Returns `true` when the polling loop has been stopped or `false`
                 * when it didn't run to begin with.
                 */
-               halt: function() { return Poll.stop() },
+               halt() { return Poll.stop() },
 
                /**
                 * Deprecated wrapper around {@link LuCI.poll.start Poll.start()}.
                 * Returns `true` when the polling loop has been started or `false`
                 * when it was already running.
                 */
-               run: function() { return Poll.start() },
+               run() { return Poll.start() },
 
                /**
                 * Legacy `L.dom` class alias. New view code should use `'require dom';`
                 * @memberof LuCI
                 * @deprecated
                 */
-               Poll: Poll,
+               Poll,
 
                /**
                 * Legacy `L.Request` class alias. New view code should use `'require request';`
                 * @memberof LuCI
                 * @deprecated
                 */
-               Request: Request,
+               Request,
 
                /**
                 * Legacy `L.Class` class alias. New view code should use `'require baseclass';`
                 * @memberof LuCI
                 * @deprecated
                 */
-               Class: Class
+               Class
        });
 
        /**
         * New code should use {@link LuCI.request} instead to implement HTTP
         * request handling.
         */
-       var XHR = Class.extend(/** @lends LuCI.xhr.prototype */ {
+       const XHR = Class.extend(/** @lends LuCI.xhr.prototype */ {
                __name__: 'LuCI.xhr',
-               __init__: function() {
+               __init__() {
                        if (window.console &amp;&amp; console.debug)
                                console.debug('Direct use XHR() is deprecated, please use L.Request instead');
                },
 
-               _response: function(cb, res, json, duration) {
+               _response(cb, res, json, duration) {
                        if (this.active)
                                cb(res, json, duration);
                        delete this.active;
                 *
                 * @return {Promise&lt;null>}
                 */
-               get: function(url, data, callback, timeout) {
+               get(url, data, callback, timeout) {
                        this.active = true;
                        LuCI.prototype.get(url, data, this._response.bind(this, callback), timeout);
                },
                 *
                 * @return {Promise&lt;null>}
                 */
-               post: function(url, data, callback, timeout) {
+               post(url, data, callback, timeout) {
                        this.active = true;
                        LuCI.prototype.post(url, data, this._response.bind(this, callback), timeout);
                },
                 * @deprecated
                 * @memberof LuCI.xhr
                 */
-               cancel: function() { delete this.active },
+               cancel() { delete this.active },
 
                /**
                 * Checks the running state of the request.
                 * Returns `true` if the request is still running or `false` if it
                 * already completed.
                 */
-               busy: function() { return (this.active === true) },
+               busy() { return (this.active === true) },
 
                /**
                 * Ignored for backwards compatibility.
                 * @deprecated
                 * @memberof LuCI.xhr
                 */
-               abort: function() {},
+               abort() {},
 
                /**
                 * Existing for backwards compatibility.
                 * Throws an `InternalError` with the message `Not implemented`
                 * when invoked.
                 */
-               send_form: function() { LuCI.prototype.error('InternalError', 'Not implemented') },
+               send_form() { LuCI.prototype.error('InternalError', 'Not implemented') },
        });
 
-       XHR.get = function() { return LuCI.prototype.get.apply(LuCI.prototype, arguments) };
-       XHR.post = function() { return LuCI.prototype.post.apply(LuCI.prototype, arguments) };
-       XHR.poll = function() { return LuCI.prototype.poll.apply(LuCI.prototype, arguments) };
+       XHR.get = (...args) => LuCI.prototype.get.call(LuCI.prototype, ...args);
+       XHR.post = (...args) => LuCI.prototype.post.call(LuCI.prototype, ...args);
+       XHR.poll = (...args) => LuCI.prototype.poll.call(LuCI.prototype, ...args);
        XHR.stop = Request.poll.remove.bind(Request.poll);
        XHR.halt = Request.poll.stop.bind(Request.poll);
        XHR.run = Request.poll.start.bind(Request.poll);
         
 
         <footer>
-            Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Thu Dec 19 2024 19:20:35 GMT+0000 (Coordinated Universal Time)
+            Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Fri Dec 20 2024 00:14:55 GMT+0000 (Coordinated Universal Time)
         </footer>
     </div>
 </div>
index f21257d410296b518dbf79c27bbcc66f257bb6b7..7b91dfbd12ea5e20f87fb8a649dea6f41a052746 100644 (file)
@@ -86,6 +86,8 @@
             
                 <li data-name="LuCI#hasViewPermission"><a href="LuCI.html#hasViewPermission">hasViewPermission</a></li>
             
+                <li data-name="LuCI#isArguments"><a href="LuCI.html#isArguments">isArguments</a></li>
+            
                 <li data-name="LuCI#isObject"><a href="LuCI.html#isObject">isObject</a></li>
             
                 <li data-name="LuCI#location"><a href="LuCI.html#location">location</a></li>
@@ -8087,7 +8089,7 @@ return Network;
         
 
         <footer>
-            Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Thu Dec 19 2024 19:20:35 GMT+0000 (Coordinated Universal Time)
+            Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Fri Dec 20 2024 00:14:55 GMT+0000 (Coordinated Universal Time)
         </footer>
     </div>
 </div>
index e32c3ca020778304593a802bb2443b6d336b7234..531f6911d658050667e181cd3b9cd0ef114e7691 100644 (file)
@@ -86,6 +86,8 @@
             
                 <li data-name="LuCI#hasViewPermission"><a href="LuCI.html#hasViewPermission">hasViewPermission</a></li>
             
+                <li data-name="LuCI#isArguments"><a href="LuCI.html#isArguments">isArguments</a></li>
+            
                 <li data-name="LuCI#isObject"><a href="LuCI.html#isObject">isObject</a></li>
             
                 <li data-name="LuCI#location"><a href="LuCI.html#location">location</a></li>
 'require baseclass';
 'require request';
 
-var rpcRequestID = 1,
-    rpcSessionID = L.env.sessionid || '00000000000000000000000000000000',
-    rpcBaseURL = L.url('admin/ubus'),
-    rpcInterceptorFns = [];
+let rpcRequestID = 1;
+let rpcSessionID = L.env.sessionid ?? '00000000000000000000000000000000';
+let rpcBaseURL = L.url('admin/ubus');
+const rpcInterceptorFns = [];
 
 /**
  * @class rpc
@@ -3656,14 +3658,14 @@ var rpcRequestID = 1,
  */
 return baseclass.extend(/** @lends LuCI.rpc.prototype */ {
        /* privates */
-       call: function(req, cb, nobatch) {
-               var q = '';
+       call(req, cb, nobatch) {
+               let q = '';
 
                if (Array.isArray(req)) {
                        if (req.length == 0)
                                return Promise.resolve([]);
 
-                       for (var i = 0; i &lt; req.length; i++)
+                       for (let i = 0; i &lt; req.length; i++)
                                if (req[i].params)
                                        q += '%s%s.%s'.format(
                                                q ? ';' : '/',
@@ -3673,14 +3675,14 @@ return baseclass.extend(/** @lends LuCI.rpc.prototype */ {
                }
 
                return request.post(rpcBaseURL + q, req, {
-                       timeout: (L.env.rpctimeout || 20) * 1000,
-                       nobatch: nobatch,
+                       timeout: (L.env.rpctimeout ?? 20) * 1000,
+                       nobatch,
                        credentials: true
                }).then(cb, cb);
        },
 
-       parseCallReply: function(req, res) {
-               var msg = null;
+       parseCallReply(req, res) {
+               let msg = null;
 
                if (res instanceof Error)
                        return req.reject(res);
@@ -3700,14 +3702,14 @@ return baseclass.extend(/** @lends LuCI.rpc.prototype */ {
                 * The interceptor args are intentionally swapped.
                 * Response is passed as first arg to align with Request class interceptors
                 */
-               Promise.all(rpcInterceptorFns.map(function(fn) { return fn(msg, req) }))
+               Promise.all(rpcInterceptorFns.map(fn => fn(msg, req)))
                        .then(this.handleCallReply.bind(this, req, msg))
                        .catch(req.reject);
        },
 
-       handleCallReply: function(req, msg) {
-               var type = Object.prototype.toString,
-                   ret = null;
+       handleCallReply(req, msg) {
+               const type = Object.prototype.toString;
+               let ret = null;
 
                try {
                        /* verify message frame */
@@ -3736,7 +3738,7 @@ return baseclass.extend(/** @lends LuCI.rpc.prototype */ {
                }
 
                if (req.expect) {
-                       for (var key in req.expect) {
+                       for (const key in req.expect) {
                                if (ret != null &amp;&amp; key != '')
                                        ret = ret[key];
 
@@ -3778,20 +3780,17 @@ return baseclass.extend(/** @lends LuCI.rpc.prototype */ {
         * more arguments, a promise resolving to an object describing the method
         * signatures of each requested `ubus` object name will be returned.
         */
-       list: function() {
-               var msg = {
+       list(...args) {
+               const msg = {
                        jsonrpc: '2.0',
                        id:      rpcRequestID++,
                        method:  'list',
-                       params:  arguments.length ? this.varargs(arguments) : undefined
+                       params:  args.length ? args : undefined
                };
 
-               return new Promise(L.bind(function(resolveFn, rejectFn) {
+               return new Promise(L.bind(function(resolve, reject) {
                        /* store request info */
-                       var req = {
-                               resolve: resolveFn,
-                               reject:  rejectFn
-                       };
+                       const req = { resolve, reject };
 
                        /* call rpc */
                        this.call(msg, this.parseCallReply.bind(this, req));
@@ -3934,37 +3933,36 @@ return baseclass.extend(/** @lends LuCI.rpc.prototype */ {
         * Returns a new function implementing the method call described in
         * `options`.
         */
-       declare: function(options) {
-               return Function.prototype.bind.call(function(rpc, options) {
-                       var args = this.varargs(arguments, 2);
-                       return new Promise(function(resolveFn, rejectFn) {
+       declare(options) {
+               return Function.prototype.bind.call(function(rpc, options, ...args) {
+                       return new Promise((resolve, reject) => {
                                /* build parameter object */
-                               var p_off = 0;
-                               var params = { };
+                               let p_off = 0;
+                               const params = { };
                                if (Array.isArray(options.params))
                                        for (p_off = 0; p_off &lt; options.params.length; p_off++)
                                                params[options.params[p_off]] = args[p_off];
 
                                /* all remaining arguments are private args */
-                               var priv = [ undefined, undefined ];
+                               const priv = [ undefined, undefined ];
                                for (; p_off &lt; args.length; p_off++)
                                        priv.push(args[p_off]);
 
                                /* store request info */
-                               var req = {
+                               const req = {
                                        expect:  options.expect,
                                        filter:  options.filter,
-                                       resolve: resolveFn,
-                                       reject:  rejectFn,
-                                       params:  params,
-                                       priv:    priv,
+                                       resolve,
+                                       reject,
+                                       params,
+                                       priv,
                                        object:  options.object,
                                        method:  options.method,
                                        raise:   options.reject
                                };
 
                                /* build message object */
-                               var msg = {
+                               const msg = {
                                        jsonrpc: '2.0',
                                        id:      rpcRequestID++,
                                        method:  'call',
@@ -3989,7 +3987,7 @@ return baseclass.extend(/** @lends LuCI.rpc.prototype */ {
         * Returns the 32 byte session ID string used for authenticating remote
         * requests.
         */
-       getSessionID: function() {
+       getSessionID() {
                return rpcSessionID;
        },
 
@@ -4000,7 +3998,7 @@ return baseclass.extend(/** @lends LuCI.rpc.prototype */ {
         * Sets the 32 byte session ID string used for authenticating remote
         * requests.
         */
-       setSessionID: function(sid) {
+       setSessionID(sid) {
                rpcSessionID = sid;
        },
 
@@ -4010,7 +4008,7 @@ return baseclass.extend(/** @lends LuCI.rpc.prototype */ {
         * @returns {string}
         * Returns the RPC URL endpoint to issue requests against.
         */
-       getBaseURL: function() {
+       getBaseURL() {
                return rpcBaseURL;
        },
 
@@ -4020,7 +4018,7 @@ return baseclass.extend(/** @lends LuCI.rpc.prototype */ {
         * @param {string} url
         * Sets the RPC URL endpoint to issue requests against.
         */
-       setBaseURL: function(url) {
+       setBaseURL(url) {
                rpcBaseURL = url;
        },
 
@@ -4034,7 +4032,7 @@ return baseclass.extend(/** @lends LuCI.rpc.prototype */ {
         * @returns {string}
         * Returns the textual description of the code.
         */
-       getStatusText: function(statusCode) {
+       getStatusText(statusCode) {
                switch (statusCode) {
                case 0: return _('Command OK');
                case 1: return _('Invalid command');
@@ -4097,9 +4095,10 @@ return baseclass.extend(/** @lends LuCI.rpc.prototype */ {
         * @returns {LuCI.rpc~interceptorFn}
         * Returns the given function value.
         */
-       addInterceptor: function(interceptorFn) {
+       addInterceptor(interceptorFn) {
                if (typeof(interceptorFn) == 'function')
                        rpcInterceptorFns.push(interceptorFn);
+
                return interceptorFn;
        },
 
@@ -4113,11 +4112,14 @@ return baseclass.extend(/** @lends LuCI.rpc.prototype */ {
         * Returns `true` if the given function has been removed or `false`
         * if it has not been found.
         */
-       removeInterceptor: function(interceptorFn) {
-               var oldlen = rpcInterceptorFns.length, i = oldlen;
+       removeInterceptor(interceptorFn) {
+               const oldlen = rpcInterceptorFns.length;
+               let i = oldlen;
+
                while (i--)
                        if (rpcInterceptorFns[i] === interceptorFn)
                                rpcInterceptorFns.splice(i, 1);
+
                return (rpcInterceptorFns.length &lt; oldlen);
        }
 });
@@ -4133,7 +4135,7 @@ return baseclass.extend(/** @lends LuCI.rpc.prototype */ {
         
 
         <footer>
-            Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Thu Dec 19 2024 19:20:35 GMT+0000 (Coordinated Universal Time)
+            Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Fri Dec 20 2024 00:14:55 GMT+0000 (Coordinated Universal Time)
         </footer>
     </div>
 </div>
index 580895d2e5a48cb8a4ffeacfdbb0e80606b4585a..baaf206a1cb4e29cc0c8b2304d8a8f28292c9b4f 100644 (file)
@@ -86,6 +86,8 @@
             
                 <li data-name="LuCI#hasViewPermission"><a href="LuCI.html#hasViewPermission">hasViewPermission</a></li>
             
+                <li data-name="LuCI#isArguments"><a href="LuCI.html#isArguments">isArguments</a></li>
+            
                 <li data-name="LuCI#isObject"><a href="LuCI.html#isObject">isObject</a></li>
             
                 <li data-name="LuCI#location"><a href="LuCI.html#location">location</a></li>
 'require baseclass';
 
 function isEmpty(object, ignore) {
-       for (var property in object)
+       for (const property in object)
                if (object.hasOwnProperty(property) &amp;&amp; property != ignore)
                        return false;
 
@@ -3660,7 +3662,7 @@ function isEmpty(object, ignore) {
  * UCI configuration data.
  */
 return baseclass.extend(/** @lends LuCI.uci.prototype */ {
-       __init__: function() {
+       __init__() {
                this.state = {
                        newidx:  0,
                        values:  { },
@@ -3738,14 +3740,14 @@ return baseclass.extend(/** @lends LuCI.uci.prototype */ {
         * A newly generated, unique section ID in the form `newXXXXXX`
         * where `X` denotes a hexadecimal digit.
         */
-       createSID: function(conf) {
-               var v = this.state.values,
-                   n = this.state.creates,
-                   sid;
+       createSID(conf) {
+               const v = this.state.values;
+               const n = this.state.creates;
+               let sid;
 
                do {
                        sid = "new%06x".format(Math.random() * 0xFFFFFF);
-               } while ((n[conf] &amp;&amp; n[conf][sid]) || (v[conf] &amp;&amp; v[conf][sid]));
+               } while ((n[conf]?.[sid]) || (v[conf]?.[sid]));
 
                return sid;
        },
@@ -3769,31 +3771,31 @@ return baseclass.extend(/** @lends LuCI.uci.prototype */ {
         * not in extended notation. Returns `null` when an extended ID could
         * not be resolved to existing section ID.
         */
-       resolveSID: function(conf, sid) {
+       resolveSID(conf, sid) {
                if (typeof(sid) != 'string')
                        return sid;
 
-               var m = /^@([a-zA-Z0-9_-]+)\[(-?[0-9]+)\]$/.exec(sid);
+               const m = /^@([a-zA-Z0-9_-]+)\[(-?[0-9]+)\]$/.exec(sid);
 
                if (m) {
-                       var type = m[1],
-                           pos = +m[2],
-                           sections = this.sections(conf, type),
-                           section = sections[pos >= 0 ? pos : sections.length + pos];
+                       const type = m[1];
+                       const pos = +m[2];
+                       const sections = this.sections(conf, type);
+                       const section = sections[pos >= 0 ? pos : sections.length + pos];
 
-                       return section ? section['.name'] : null;
+                       return section?.['.name'] ?? null;
                }
 
                return sid;
        },
 
        /* private */
-       reorderSections: function() {
-               var v = this.state.values,
-                   n = this.state.creates,
-                   d = this.state.deletes,
-                   r = this.state.reorder,
-                   tasks = [];
+       reorderSections() {
+               const v = this.state.values;
+               const n = this.state.creates;
+               const d = this.state.deletes;
+               const r = this.state.reorder;
+               const tasks = [];
 
                if (Object.keys(r).length === 0)
                        return Promise.resolve();
@@ -3802,8 +3804,8 @@ return baseclass.extend(/** @lends LuCI.uci.prototype */ {
                 gather all created and existing sections, sort them according
                 to their index value and issue an uci order call
                */
-               for (var c in r) {
-                       var o = [ ];
+               for (const c in r) {
+                       const o = [ ];
 
                        // skip deletes within re-orders
                        if (d[c])
@@ -3811,21 +3813,19 @@ return baseclass.extend(/** @lends LuCI.uci.prototype */ {
 
                        // push creates
                        if (n[c])
-                               for (var s in n[c])
+                               for (const s in n[c])
                                        o.push(n[c][s]);
 
                        // push values
-                       for (var s in v[c])
+                       for (const s in v[c])
                                o.push(v[c][s]);
 
                        if (o.length > 0) {
-                               o.sort(function(a, b) {
-                                       return (a['.index'] - b['.index']);
-                               });
+                               o.sort((a, b) => a['.index'] - b['.index']);
 
-                               var sids = [ ];
+                               const sids = [ ];
 
-                               for (var i = 0; i &lt; o.length; i++)
+                               for (let i = 0; i &lt; o.length; i++)
                                        sids.push(o[i]['.name']);
 
                                tasks.push(this.callOrder(c, sids));
@@ -3837,7 +3837,7 @@ return baseclass.extend(/** @lends LuCI.uci.prototype */ {
        },
 
        /* private */
-       loadPackage: function(packageName) {
+       loadPackage(packageName) {
                if (this.loaded[packageName] == null)
                        return (this.loaded[packageName] = this.callLoad(packageName));
 
@@ -3862,22 +3862,22 @@ return baseclass.extend(/** @lends LuCI.uci.prototype */ {
         * Returns a promise resolving to the names of the configurations
         * that have been successfully loaded.
         */
-       load: function(packages) {
-               var self = this,
-                   pkgs = [ ],
-                   tasks = [];
+       load(packages) {
+               const self = this;
+               const pkgs = [ ];
+               const tasks = [];
 
                if (!Array.isArray(packages))
                        packages = [ packages ];
 
-               for (var i = 0; i &lt; packages.length; i++)
+               for (let i = 0; i &lt; packages.length; i++)
                        if (!self.state.values[packages[i]]) {
                                pkgs.push(packages[i]);
                                tasks.push(self.loadPackage(packages[i]));
                        }
 
-               return Promise.all(tasks).then(function(responses) {
-                       for (var i = 0; i &lt; responses.length; i++)
+               return Promise.all(tasks).then(responses => {
+                       for (let i = 0; i &lt; responses.length; i++)
                                self.state.values[pkgs[i]] = responses[i];
 
                        if (responses.length)
@@ -3894,11 +3894,11 @@ return baseclass.extend(/** @lends LuCI.uci.prototype */ {
         * The name of the configuration or an array of configuration
         * names to unload.
         */
-       unload: function(packages) {
+       unload(packages) {
                if (!Array.isArray(packages))
                        packages = [ packages ];
 
-               for (var i = 0; i &lt; packages.length; i++) {
+               for (let i = 0; i &lt; packages.length; i++) {
                        delete this.state.values[packages[i]];
                        delete this.state.creates[packages[i]];
                        delete this.state.changes[packages[i]];
@@ -3926,13 +3926,11 @@ return baseclass.extend(/** @lends LuCI.uci.prototype */ {
         * Returns the section ID of the newly added section which is equivalent
         * to the given name for non-anonymous sections.
         */
-       add: function(conf, type, name) {
-               var n = this.state.creates,
-                   sid = name || this.createSID(conf);
-
-               if (!n[conf])
-                       n[conf] = { };
+       add(conf, type, name) {
+               const n = this.state.creates;
+               const sid = name || this.createSID(conf);
 
+               n[conf] ??= { };
                n[conf][sid] = {
                        '.type':      type,
                        '.name':      sid,
@@ -3968,7 +3966,7 @@ return baseclass.extend(/** @lends LuCI.uci.prototype */ {
         * Returns the section ID of the newly cloned section which is equivalent
         * to the given name for non-anonymous sections.
         */
-       clone: function(conf, type, srcsid, put_next, name) {
+       clone(conf, type, srcsid, put_next, name) {
                let n = this.state.creates;
                let sid = this.createSID(conf);
                let v = this.state.values;
@@ -4000,23 +3998,20 @@ return baseclass.extend(/** @lends LuCI.uci.prototype */ {
         * @param {string} sid
         * The ID of the section to remove.
         */
-       remove: function(conf, sid) {
-               var v = this.state.values,
-                   n = this.state.creates,
-                   c = this.state.changes,
-                   d = this.state.deletes;
+       remove(conf, sid) {
+               const v = this.state.values;
+               const n = this.state.creates;
+               const c = this.state.changes;
+               const d = this.state.deletes;
 
                /* requested deletion of a just created section */
-               if (n[conf] &amp;&amp; n[conf][sid]) {
+               if (n[conf]?.[sid]) {
                        delete n[conf][sid];
                }
-               else if (v[conf] &amp;&amp; v[conf][sid]) {
-                       if (c[conf])
-                               delete c[conf][sid];
-
-                       if (!d[conf])
-                               d[conf] = { };
+               else if (v[conf]?.[sid]) {
+                       delete c[conf]?.[sid];
 
+                       d[conf] ??= { };
                        d[conf][sid] = true;
                }
        },
@@ -4089,35 +4084,35 @@ return baseclass.extend(/** @lends LuCI.uci.prototype */ {
         * Returns a sorted array of the section objects within the given
         * configuration, filtered by type, if a type has been specified.
         */
-       sections: function(conf, type, cb) {
-               var sa = [ ],
-                   v = this.state.values[conf],
-                   n = this.state.creates[conf],
-                   c = this.state.changes[conf],
-                   d = this.state.deletes[conf];
+       sections(conf, type, cb) {
+               const sa = [ ];
+               const v = this.state.values[conf];
+               const n = this.state.creates[conf];
+               const c = this.state.changes[conf];
+               const d = this.state.deletes[conf];
 
                if (!v)
                        return sa;
 
-               for (var s in v)
+               for (const s in v)
                        if (!d || d[s] !== true)
                                if (!type || v[s]['.type'] == type)
                                        sa.push(Object.assign({ }, v[s], c ? c[s] : null));
 
                if (n)
-                       for (var s in n)
+                       for (const s in n)
                                if (!type || n[s]['.type'] == type)
                                        sa.push(Object.assign({ }, n[s]));
 
-               sa.sort(function(a, b) {
+               sa.sort((a, b) => {
                        return a['.index'] - b['.index'];
                });
 
-               for (var i = 0; i &lt; sa.length; i++)
+               for (let i = 0; i &lt; sa.length; i++)
                        sa[i]['.index'] = i;
 
                if (typeof(cb) == 'function')
-                       for (var i = 0; i &lt; sa.length; i++)
+                       for (let i = 0; i &lt; sa.length; i++)
                                cb.call(this, sa[i], sa[i]['.name']);
 
                return sa;
@@ -4148,11 +4143,11 @@ return baseclass.extend(/** @lends LuCI.uci.prototype */ {
         * - Returns `null` if the config, section or option has not been
         *   found or if the corresponding configuration is not loaded.
         */
-       get: function(conf, sid, opt) {
-               var v = this.state.values,
-                   n = this.state.creates,
-                   c = this.state.changes,
-                   d = this.state.deletes;
+       get(conf, sid, opt) {
+               const v = this.state.values;
+               const n = this.state.creates;
+               const c = this.state.changes;
+               const d = this.state.deletes;
 
                sid = this.resolveSID(conf, sid);
 
@@ -4160,10 +4155,7 @@ return baseclass.extend(/** @lends LuCI.uci.prototype */ {
                        return null;
 
                /* requested option in a just created section */
-               if (n[conf] &amp;&amp; n[conf][sid]) {
-                       if (!n[conf])
-                               return null;
-
+               if (n[conf]?.[sid]) {
                        if (opt == null)
                                return n[conf][sid];
 
@@ -4173,16 +4165,16 @@ return baseclass.extend(/** @lends LuCI.uci.prototype */ {
                /* requested an option value */
                if (opt != null) {
                        /* check whether option was deleted */
-                       if (d[conf] &amp;&amp; d[conf][sid])
+                       if (d[conf]?.[sid])
                                if (d[conf][sid] === true || d[conf][sid][opt])
                                        return null;
 
                        /* check whether option was changed */
-                       if (c[conf] &amp;&amp; c[conf][sid] &amp;&amp; c[conf][sid][opt] != null)
+                       if (c[conf]?.[sid][opt] != null)
                                return c[conf][sid][opt];
 
                        /* return base value */
-                       if (v[conf] &amp;&amp; v[conf][sid])
+                       if (v[conf]?.[sid])
                                return v[conf][sid][opt];
 
                        return null;
@@ -4191,21 +4183,21 @@ return baseclass.extend(/** @lends LuCI.uci.prototype */ {
                /* requested an entire section */
                if (v[conf]) {
                        /* check whether entire section was deleted */
-                       if (d[conf] &amp;&amp; d[conf][sid] === true)
+                       if (d[conf]?.[sid] === true)
                                return null;
 
-                       var s = v[conf][sid] || null;
+                       const s = v[conf][sid] || null;
 
                        if (s) {
                                /* merge changes */
-                               if (c[conf] &amp;&amp; c[conf][sid])
-                                       for (var opt in c[conf][sid])
+                               if (c[conf]?.[sid])
+                                       for (const opt in c[conf][sid])
                                                if (c[conf][sid][opt] != null)
                                                        s[opt] = c[conf][sid][opt];
 
                                /* merge deletions */
-                               if (d[conf] &amp;&amp; d[conf][sid])
-                                       for (var opt in d[conf][sid])
+                               if (d[conf]?.[sid])
+                                       for (const opt in d[conf][sid])
                                                delete s[opt];
                        }
 
@@ -4236,18 +4228,18 @@ return baseclass.extend(/** @lends LuCI.uci.prototype */ {
         * the option will be removed, otherwise it will be set or overwritten
         * with the given value.
         */
-       set: function(conf, sid, opt, val) {
-               var v = this.state.values,
-                   n = this.state.creates,
-                   c = this.state.changes,
-                   d = this.state.deletes;
+       set(conf, sid, opt, val) {
+               const v = this.state.values;
+               const n = this.state.creates;
+               const c = this.state.changes;
+               const d = this.state.deletes;
 
                sid = this.resolveSID(conf, sid);
 
                if (sid == null || opt == null || opt.charAt(0) == '.')
                        return;
 
-               if (n[conf] &amp;&amp; n[conf][sid]) {
+               if (n[conf]?.[sid]) {
                        if (val != null)
                                n[conf][sid][opt] = val;
                        else
@@ -4259,17 +4251,14 @@ return baseclass.extend(/** @lends LuCI.uci.prototype */ {
                                return;
 
                        /* only set in existing sections */
-                       if (!v[conf] || !v[conf][sid])
+                       if (!v[conf]?.[sid])
                                return;
 
-                       if (!c[conf])
-                               c[conf] = {};
-
-                       if (!c[conf][sid])
-                               c[conf][sid] = {};
+                       c[conf] ??= {};
+                       c[conf][sid] ??= {};
 
                        /* undelete option */
-                       if (d[conf] &amp;&amp; d[conf][sid]) {
+                       if (d[conf]?.[sid]) {
                                if (isEmpty(d[conf][sid], opt))
                                        delete d[conf][sid];
                                else
@@ -4280,7 +4269,7 @@ return baseclass.extend(/** @lends LuCI.uci.prototype */ {
                }
                else {
                        /* revert any change for to-be-deleted option */
-                       if (c[conf] &amp;&amp; c[conf][sid]) {
+                       if (c[conf]?.[sid]) {
                                if (isEmpty(c[conf][sid], opt))
                                        delete c[conf][sid];
                                else
@@ -4288,12 +4277,9 @@ return baseclass.extend(/** @lends LuCI.uci.prototype */ {
                        }
 
                        /* only delete existing options */
-                       if (v[conf] &amp;&amp; v[conf][sid] &amp;&amp; v[conf][sid].hasOwnProperty(opt)) {
-                               if (!d[conf])
-                                       d[conf] = { };
-
-                               if (!d[conf][sid])
-                                       d[conf][sid] = { };
+                       if (v[conf]?.[sid].hasOwnProperty(opt)) {
+                               d[conf] ??= { };
+                               d[conf][sid] ??= { };
 
                                if (d[conf][sid] !== true)
                                        d[conf][sid][opt] = true;
@@ -4317,7 +4303,7 @@ return baseclass.extend(/** @lends LuCI.uci.prototype */ {
         * @param {string} opt
         * The name of the option to remove.
         */
-       unset: function(conf, sid, opt) {
+       unset(conf, sid, opt) {
                return this.set(conf, sid, opt, null);
        },
 
@@ -4348,12 +4334,11 @@ return baseclass.extend(/** @lends LuCI.uci.prototype */ {
         * - Returns `null` if the config, section or option has not been
         *   found or if the corresponding configuration is not loaded.
         */
-       get_first: function(conf, type, opt) {
-               var sid = null;
+       get_first(conf, type, opt) {
+               let sid = null;
 
-               this.sections(conf, type, function(s) {
-                       if (sid == null)
-                               sid = s['.name'];
+               this.sections(conf, type, s => {
+                       sid ??= s['.name'];
                });
 
                return this.get(conf, sid, opt);
@@ -4383,12 +4368,11 @@ return baseclass.extend(/** @lends LuCI.uci.prototype */ {
         * the option will be removed, otherwise it will be set or overwritten
         * with the given value.
         */
-       set_first: function(conf, type, opt, val) {
-               var sid = null;
+       set_first(conf, type, opt, val) {
+               let sid = null;
 
-               this.sections(conf, type, function(s) {
-                       if (sid == null)
-                               sid = s['.name'];
+               this.sections(conf, type, s => {
+                       sid ??= s['.name'];
                });
 
                return this.set(conf, sid, opt, val);
@@ -4413,7 +4397,7 @@ return baseclass.extend(/** @lends LuCI.uci.prototype */ {
         * @param {string} opt
         * The option name to set the value for.
         */
-       unset_first: function(conf, type, opt) {
+       unset_first(conf, type, opt) {
                return this.set_first(conf, type, opt, null);
        },
 
@@ -4448,14 +4432,15 @@ return baseclass.extend(/** @lends LuCI.uci.prototype */ {
         * Returns `true` when the section was successfully moved, or `false`
         * when either the section specified by `sid1` or by `sid2` is not found.
         */
-       move: function(conf, sid1, sid2, after) {
-               var sa = this.sections(conf),
-                   s1 = null, s2 = null;
+       move(conf, sid1, sid2, after) {
+               const sa = this.sections(conf);
+               let s1 = null;
+               let s2 = null;
 
                sid1 = this.resolveSID(conf, sid1);
                sid2 = this.resolveSID(conf, sid2);
 
-               for (var i = 0; i &lt; sa.length; i++) {
+               for (let i = 0; i &lt; sa.length; i++) {
                        if (sa[i]['.name'] != sid1)
                                continue;
 
@@ -4471,7 +4456,7 @@ return baseclass.extend(/** @lends LuCI.uci.prototype */ {
                        sa.push(s1);
                }
                else {
-                       for (var i = 0; i &lt; sa.length; i++) {
+                       for (let i = 0; i &lt; sa.length; i++) {
                                if (sa[i]['.name'] != sid2)
                                        continue;
 
@@ -4484,7 +4469,7 @@ return baseclass.extend(/** @lends LuCI.uci.prototype */ {
                                return false;
                }
 
-               for (var i = 0; i &lt; sa.length; i++)
+               for (let i = 0; i &lt; sa.length; i++)
                        this.get(conf, sa[i]['.name'])['.index'] = i;
 
                this.state.reorder[conf] = true;
@@ -4502,21 +4487,21 @@ return baseclass.extend(/** @lends LuCI.uci.prototype */ {
         * Returns a promise resolving to an array of configuration names which
         * have been reloaded by the save operation.
         */
-       save: function() {
-               var v = this.state.values,
-                   n = this.state.creates,
-                   c = this.state.changes,
-                   d = this.state.deletes,
-                   r = this.state.reorder,
-                   self = this,
-                   snew = [ ],
-                   pkgs = { },
-                   tasks = [];
+       save() {
+               const v = this.state.values;
+               const n = this.state.creates;
+               const c = this.state.changes;
+               const d = this.state.deletes;
+               const r = this.state.reorder;
+               const self = this;
+               const snew = [ ];
+               let pkgs = { };
+               const tasks = [];
 
                if (d)
-                       for (var conf in d) {
-                               for (var sid in d[conf]) {
-                                       var o = d[conf][sid];
+                       for (const conf in d) {
+                               for (const sid in d[conf]) {
+                                       const o = d[conf][sid];
 
                                        if (o === true)
                                                tasks.push(self.callDelete(conf, sid, null));
@@ -4528,14 +4513,14 @@ return baseclass.extend(/** @lends LuCI.uci.prototype */ {
                        }
 
                if (n)
-                       for (var conf in n) {
-                               for (var sid in n[conf]) {
-                                       var p = {
+                       for (const conf in n) {
+                               for (const sid in n[conf]) {
+                                       const p = {
                                                config: conf,
                                                values: { }
                                        };
 
-                                       for (var k in n[conf][sid]) {
+                                       for (const k in n[conf][sid]) {
                                                if (k == '.type')
                                                        p.type = n[conf][sid][k];
                                                else if (k == '.create')
@@ -4552,27 +4537,27 @@ return baseclass.extend(/** @lends LuCI.uci.prototype */ {
                        }
 
                if (c)
-                       for (var conf in c) {
-                               for (var sid in c[conf])
+                       for (const conf in c) {
+                               for (const sid in c[conf])
                                        tasks.push(self.callSet(conf, sid, c[conf][sid]));
 
                                pkgs[conf] = true;
                        }
 
                if (r)
-                       for (var conf in r)
+                       for (const conf in r)
                                pkgs[conf] = true;
 
-               return Promise.all(tasks).then(function(responses) {
+               return Promise.all(tasks).then(responses => {
                        /*
                         array "snew" holds references to the created uci sections,
                         use it to assign the returned names of the new sections
                        */
-                       for (var i = 0; i &lt; snew.length; i++)
+                       for (let i = 0; i &lt; snew.length; i++)
                                snew[i]['.name'] = responses[i];
 
                        return self.reorderSections();
-               }).then(function() {
+               }).then(() => {
                        pkgs = Object.keys(pkgs);
 
                        self.unload(pkgs);
@@ -4592,20 +4577,20 @@ return baseclass.extend(/** @lends LuCI.uci.prototype */ {
         * @returns {Promise&lt;number>}
         * Returns a promise resolving/rejecting with the `ubus` RPC status code.
         */
-       apply: function(timeout) {
-               var self = this,
-                   date = new Date();
+       apply(timeout) {
+               const self = this;
+               const date = new Date();
 
                if (typeof(timeout) != 'number' || timeout &lt; 1)
                        timeout = 10;
 
-               return self.callApply(timeout, true).then(function(rv) {
+               return self.callApply(timeout, true).then(rv => {
                        if (rv != 0)
                                return Promise.reject(rv);
 
-                       var try_deadline = date.getTime() + 1000 * timeout;
-                       var try_confirm = function() {
-                               return self.callConfirm().then(function(rv) {
+                       const try_deadline = date.getTime() + 1000 * timeout;
+                       const try_confirm = () => {
+                               return self.callConfirm().then(rv => {
                                        if (rv != 0) {
                                                if (date.getTime() &lt; try_deadline)
                                                        window.setTimeout(try_confirm, 250);
@@ -4690,7 +4675,7 @@ return baseclass.extend(/** @lends LuCI.uci.prototype */ {
         
 
         <footer>
-            Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Thu Dec 19 2024 19:20:35 GMT+0000 (Coordinated Universal Time)
+            Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Fri Dec 20 2024 00:14:55 GMT+0000 (Coordinated Universal Time)
         </footer>
     </div>
 </div>
index 49fc1b93a5ff8c5ef086f003f64e7af0d56564a9..f0aadb7ed45cef726e74300abe360f32dad77ff1 100644 (file)
@@ -86,6 +86,8 @@
             
                 <li data-name="LuCI#hasViewPermission"><a href="LuCI.html#hasViewPermission">hasViewPermission</a></li>
             
+                <li data-name="LuCI#isArguments"><a href="LuCI.html#isArguments">isArguments</a></li>
+            
                 <li data-name="LuCI#isObject"><a href="LuCI.html#isObject">isObject</a></li>
             
                 <li data-name="LuCI#location"><a href="LuCI.html#location">location</a></li>
 'require uci';
 'require fs';
 
-var modalDiv = null,
-    tooltipDiv = null,
-    indicatorDiv = null,
-    tooltipTimeout = null;
+let modalDiv = null;
+let tooltipDiv = null;
+let indicatorDiv = null;
+let tooltipTimeout = null;
 
 /**
  * @class AbstractElement
@@ -3672,7 +3674,7 @@ var modalDiv = null,
  * it in external JavaScript, use `L.require("ui").then(...)` and access the
  * `AbstractElement` property of the class instance value.
  */
-var UIElement = baseclass.extend(/** @lends LuCI.ui.AbstractElement.prototype */ {
+const UIElement = baseclass.extend(/** @lends LuCI.ui.AbstractElement.prototype */ {
        /**
         * @typedef {Object} InitOptions
         * @memberof LuCI.ui.AbstractElement
@@ -3716,7 +3718,7 @@ var UIElement = baseclass.extend(/** @lends LuCI.ui.AbstractElement.prototype */
         * string. Complex widgets such as `DynamicList` instances may result in
         * an array of strings or `null` for unset values.
         */
-       getValue: function() {
+       getValue() {
                if (dom.matches(this.node, 'select') || dom.matches(this.node, 'input'))
                        return this.node.value;
 
@@ -3734,7 +3736,7 @@ var UIElement = baseclass.extend(/** @lends LuCI.ui.AbstractElement.prototype */
         * Complex widgets such as `DynamicList` instances may accept string array
         * or `null` values.
         */
-       setValue: function(value) {
+       setValue(value) {
                if (dom.matches(this.node, 'select') || dom.matches(this.node, 'input'))
                        this.node.value = value;
        },
@@ -3748,10 +3750,10 @@ var UIElement = baseclass.extend(/** @lends LuCI.ui.AbstractElement.prototype */
         * The placeholder to set for the input element. Only applicable to text
         * inputs, not to radio buttons, selects or similar.
         */
-       setPlaceholder: function(value) {
-               var node = this.node ? this.node.querySelector('input,textarea') : null;
+       setPlaceholder(value) {
+               const node = this.node ? this.node.querySelector('input,textarea') : null;
                if (node) {
-                       switch (node.getAttribute('type') || 'text') {
+                       switch (node.getAttribute('type') ?? 'text') {
                        case 'password':
                        case 'search':
                        case 'tel':
@@ -3776,7 +3778,7 @@ var UIElement = baseclass.extend(/** @lends LuCI.ui.AbstractElement.prototype */
         * value and changes it back to the original state, it is still reported
         * as changed.
         */
-       isChanged: function() {
+       isChanged() {
                return (this.node ? this.node.getAttribute('data-changed') : null) == 'true';
        },
 
@@ -3789,7 +3791,7 @@ var UIElement = baseclass.extend(/** @lends LuCI.ui.AbstractElement.prototype */
         * Returns `true` if the current input value is valid or `false` if it does
         * not meet the validation constraints.
         */
-       isValid: function() {
+       isValid() {
                return (this.validState !== false);
        },
 
@@ -3801,8 +3803,8 @@ var UIElement = baseclass.extend(/** @lends LuCI.ui.AbstractElement.prototype */
         * @returns {string}
         * The validation error at this time
         */
-       getValidationError: function() {
-               return this.validationError || '';
+       getValidationError() {
+               return this.validationError ?? '';
        },
 
        /**
@@ -3815,11 +3817,11 @@ var UIElement = baseclass.extend(/** @lends LuCI.ui.AbstractElement.prototype */
         * @instance
         * @memberof LuCI.ui.AbstractElement
         */
-       triggerValidation: function() {
+       triggerValidation() {
                if (typeof(this.vfunc) != 'function')
                        return false;
 
-               var wasValid = this.isValid();
+               const wasValid = this.isValid();
 
                this.vfunc();
 
@@ -3850,12 +3852,12 @@ var UIElement = baseclass.extend(/** @lends LuCI.ui.AbstractElement.prototype */
         * @param {string[]} events
         * The native DOM events for which event handlers should be registered.
         */
-       registerEvents: function(targetNode, synevent, events) {
-               var dispatchFn = L.bind(function(ev) {
+       registerEvents(targetNode, synevent, events) {
+               const dispatchFn = L.bind((ev) => {
                        this.node.dispatchEvent(new CustomEvent(synevent, { bubbles: true }));
                }, this);
 
-               for (var i = 0; i &lt; events.length; i++)
+               for (let i = 0; i &lt; events.length; i++)
                        targetNode.addEventListener(events[i], dispatchFn);
        },
 
@@ -3875,28 +3877,27 @@ var UIElement = baseclass.extend(/** @lends LuCI.ui.AbstractElement.prototype */
         * @param {...string} events
         * The DOM events for which event handlers should be registered.
         */
-       setUpdateEvents: function(targetNode /*, ... */) {
-               var datatype = this.options.datatype,
-                   optional = this.options.hasOwnProperty('optional') ? this.options.optional : true,
-                   validate = this.options.validate,
-                   events = this.varargs(arguments, 1);
+       setUpdateEvents(targetNode, ...events) {
+               const datatype = this.options.datatype;
+               const optional = this.options.hasOwnProperty('optional') ? this.options.optional : true;
+               const validate = this.options.validate;
 
                this.registerEvents(targetNode, 'widget-update', events);
 
                if (!datatype &amp;&amp; !validate)
                        return;
 
-               this.vfunc = UI.prototype.addValidator.apply(UI.prototype, [
-                       targetNode, datatype || 'string',
+               this.vfunc = UI.prototype.addValidator(...[
+                       targetNode, datatype ?? 'string',
                        optional, validate
                ].concat(events));
 
-               this.node.addEventListener('validation-success', L.bind(function(ev) {
+               this.node.addEventListener('validation-success', L.bind((ev) => {
                        this.validState = true;
                        this.validationError = '';
                }, this));
 
-               this.node.addEventListener('validation-failure', L.bind(function(ev) {
+               this.node.addEventListener('validation-failure', L.bind((ev) => {
                        this.validState = false;
                        this.validationError = ev.detail.message;
                }, this));
@@ -3920,13 +3921,13 @@ var UIElement = baseclass.extend(/** @lends LuCI.ui.AbstractElement.prototype */
         * @param {...string} events
         * The DOM events for which event handlers should be registered.
         */
-       setChangeEvents: function(targetNode /*, ... */) {
-               var tag_changed = L.bind(function(ev) { this.setAttribute('data-changed', true) }, this.node);
+       setChangeEvents(targetNode, ...events) {
+               const tag_changed = L.bind(function(ev) { this.setAttribute('data-changed', true) }, this.node);
 
-               for (var i = 1; i &lt; arguments.length; i++)
-                       targetNode.addEventListener(arguments[i], tag_changed);
+               for (let i = 0; i &lt; events.length; i++)
+                       targetNode.addEventListener(events[i], tag_changed);
 
-               this.registerEvents(targetNode, 'widget-change', this.varargs(arguments, 1));
+               this.registerEvents(targetNode, 'widget-change', events);
        },
 
        /**
@@ -3939,7 +3940,7 @@ var UIElement = baseclass.extend(/** @lends LuCI.ui.AbstractElement.prototype */
         * Returns a DOM Node or DocumentFragment containing the rendered
         * widget markup.
         */
-       render: function() {}
+       render() {}
 });
 
 /**
@@ -3968,7 +3969,7 @@ var UIElement = baseclass.extend(/** @lends LuCI.ui.AbstractElement.prototype */
  * @param {LuCI.ui.Textfield.InitOptions} [options]
  * Object describing the widget specific options to initialize the input.
  */
-var UITextfield = UIElement.extend(/** @lends LuCI.ui.Textfield.prototype */ {
+const UITextfield = UIElement.extend(/** @lends LuCI.ui.Textfield.prototype */ {
        /**
         * In addition to the [AbstractElement.InitOptions]{@link LuCI.ui.AbstractElement.InitOptions}
         * the following properties are recognized:
@@ -3992,7 +3993,7 @@ var UITextfield = UIElement.extend(/** @lends LuCI.ui.Textfield.prototype */ {
         * Specifies the HTML `placeholder` attribute which is displayed when the
         * corresponding `&lt;input>` element is empty.
         */
-       __init__: function(value, options) {
+       __init__(value, options) {
                this.value = value;
                this.options = Object.assign({
                        optional: true,
@@ -4001,10 +4002,10 @@ var UITextfield = UIElement.extend(/** @lends LuCI.ui.Textfield.prototype */ {
        },
 
        /** @override */
-       render: function() {
-               var frameEl = E('div', { 'id': this.options.id });
-               var inputEl = E('input', {
-                       'id': this.options.id ? 'widget.' + this.options.id : null,
+       render() {
+               const frameEl = E('div', { 'id': this.options.id });
+               const inputEl = E('input', {
+                       'id': this.options.id ? `widget.${this.options.id}` : null,
                        'name': this.options.name,
                        'type': 'text',
                        'class': this.options.password ? 'cbi-input-password' : 'cbi-input-text',
@@ -4012,7 +4013,6 @@ var UITextfield = UIElement.extend(/** @lends LuCI.ui.Textfield.prototype */ {
                        'disabled': this.options.disabled ? '' : null,
                        'maxlength': this.options.maxlength,
                        'placeholder': this.options.placeholder,
-                       'autocomplete': this.options.password ? 'new-password' : null,
                        'value': this.value,
                });
 
@@ -4024,14 +4024,14 @@ var UITextfield = UIElement.extend(/** @lends LuCI.ui.Textfield.prototype */ {
                                        'title': _('Reveal/hide password'),
                                        'aria-label': _('Reveal/hide password'),
                                        'click': function(ev) {
-                                               var e = this.previousElementSibling;
+                                               const e = this.previousElementSibling;
                                                e.type = (e.type === 'password') ? 'text' : 'password';
                                                ev.preventDefault();
                                        }
                                }, '∗')
                        ]));
 
-                       window.requestAnimationFrame(function() { inputEl.type = 'password' });
+                       window.requestAnimationFrame(() => { inputEl.type = 'password' });
                }
                else {
                        frameEl.appendChild(inputEl);
@@ -4041,8 +4041,8 @@ var UITextfield = UIElement.extend(/** @lends LuCI.ui.Textfield.prototype */ {
        },
 
        /** @private */
-       bind: function(frameEl) {
-               var inputEl = frameEl.querySelector('input');
+       bind(frameEl) {
+               const inputEl = frameEl.querySelector('input');
 
                this.node = frameEl;
 
@@ -4055,14 +4055,14 @@ var UITextfield = UIElement.extend(/** @lends LuCI.ui.Textfield.prototype */ {
        },
 
        /** @override */
-       getValue: function() {
-               var inputEl = this.node.querySelector('input');
+       getValue() {
+               const inputEl = this.node.querySelector('input');
                return inputEl.value;
        },
 
        /** @override */
-       setValue: function(value) {
-               var inputEl = this.node.querySelector('input');
+       setValue(value) {
+               const inputEl = this.node.querySelector('input');
                inputEl.value = value;
        }
 });
@@ -4093,7 +4093,7 @@ var UITextfield = UIElement.extend(/** @lends LuCI.ui.Textfield.prototype */ {
  * @param {LuCI.ui.Textarea.InitOptions} [options]
  * Object describing the widget specific options to initialize the input.
  */
-var UITextarea = UIElement.extend(/** @lends LuCI.ui.Textarea.prototype */ {
+const UITextarea = UIElement.extend(/** @lends LuCI.ui.Textarea.prototype */ {
        /**
         * In addition to the [AbstractElement.InitOptions]{@link LuCI.ui.AbstractElement.InitOptions}
         * the following properties are recognized:
@@ -4123,7 +4123,7 @@ var UITextarea = UIElement.extend(/** @lends LuCI.ui.Textarea.prototype */ {
         * @property {boolean} [wrap=false]
         * Specifies whether the HTML `wrap` attribute should be set.
         */
-       __init__: function(value, options) {
+       __init__(value, options) {
                this.value = value;
                this.options = Object.assign({
                        optional: true,
@@ -4134,13 +4134,13 @@ var UITextarea = UIElement.extend(/** @lends LuCI.ui.Textarea.prototype */ {
        },
 
        /** @override */
-       render: function() {
-               var style = !this.options.cols ? 'width:100%' : null,
-                   frameEl = E('div', { 'id': this.options.id, 'style': style }),
-                   value = (this.value != null) ? String(this.value) : '';
+       render() {
+               const style = !this.options.cols ? 'width:100%' : null;
+               const frameEl = E('div', { 'id': this.options.id, 'style': style });
+               const value = (this.value != null) ? String(this.value) : '';
 
                frameEl.appendChild(E('textarea', {
-                       'id': this.options.id ? 'widget.' + this.options.id : null,
+                       'id': this.options.id ? `widget.${this.options.id}` : null,
                        'name': this.options.name,
                        'class': 'cbi-input-textarea',
                        'readonly': this.options.readonly ? '' : null,
@@ -4159,8 +4159,8 @@ var UITextarea = UIElement.extend(/** @lends LuCI.ui.Textarea.prototype */ {
        },
 
        /** @private */
-       bind: function(frameEl) {
-               var inputEl = frameEl.firstElementChild;
+       bind(frameEl) {
+               const inputEl = frameEl.firstElementChild;
 
                this.node = frameEl;
 
@@ -4173,12 +4173,12 @@ var UITextarea = UIElement.extend(/** @lends LuCI.ui.Textarea.prototype */ {
        },
 
        /** @override */
-       getValue: function() {
+       getValue() {
                return this.node.firstElementChild.value;
        },
 
        /** @override */
-       setValue: function(value) {
+       setValue(value) {
                this.node.firstElementChild.value = value;
        }
 });
@@ -4209,7 +4209,7 @@ var UITextarea = UIElement.extend(/** @lends LuCI.ui.Textarea.prototype */ {
  * @param {LuCI.ui.Checkbox.InitOptions} [options]
  * Object describing the widget specific options to initialize the input.
  */
-var UICheckbox = UIElement.extend(/** @lends LuCI.ui.Checkbox.prototype */ {
+const UICheckbox = UIElement.extend(/** @lends LuCI.ui.Checkbox.prototype */ {
        /**
         * In addition to the [AbstractElement.InitOptions]{@link LuCI.ui.AbstractElement.InitOptions}
         * the following properties are recognized:
@@ -4228,7 +4228,7 @@ var UICheckbox = UIElement.extend(/** @lends LuCI.ui.Checkbox.prototype */ {
         * checkbox. This is a legacy property existing for compatibility reasons,
         * it is required for HTML based form submissions.
         */
-       __init__: function(value, options) {
+       __init__(value, options) {
                this.value = value;
                this.options = Object.assign({
                        value_enabled: '1',
@@ -4237,9 +4237,9 @@ var UICheckbox = UIElement.extend(/** @lends LuCI.ui.Checkbox.prototype */ {
        },
 
        /** @override */
-       render: function() {
-               var id = 'cb%08x'.format(Math.random() * 0xffffffff);
-               var frameEl = E('div', {
+       render() {
+               const id = 'cb%08x'.format(Math.random() * 0xffffffff);
+               const frameEl = E('div', {
                        'id': this.options.id,
                        'class': 'cbi-checkbox'
                });
@@ -4258,13 +4258,13 @@ var UICheckbox = UIElement.extend(/** @lends LuCI.ui.Checkbox.prototype */ {
                        'value': this.options.value_enabled,
                        'checked': (this.value == this.options.value_enabled) ? '' : null,
                        'disabled': this.options.disabled ? '' : null,
-                       'data-widget-id': this.options.id ? 'widget.' + this.options.id : null
+                       'data-widget-id': this.options.id ? `widget.${this.options.id}` : null
                }));
 
                frameEl.appendChild(E('label', { 'for': id }));
 
                if (this.options.tooltip != null) {
-                       var icon = "⚠️";
+                       let icon = "⚠️";
 
                        if (this.options.tooltipicon != null)
                                icon = this.options.tooltipicon;
@@ -4283,10 +4283,10 @@ var UICheckbox = UIElement.extend(/** @lends LuCI.ui.Checkbox.prototype */ {
        },
 
        /** @private */
-       bind: function(frameEl) {
+       bind(frameEl) {
                this.node = frameEl;
 
-               var input = frameEl.querySelector('input[type="checkbox"]');
+               const input = frameEl.querySelector('input[type="checkbox"]');
                this.setUpdateEvents(input, 'click', 'blur');
                this.setChangeEvents(input, 'change');
 
@@ -4303,19 +4303,19 @@ var UICheckbox = UIElement.extend(/** @lends LuCI.ui.Checkbox.prototype */ {
         * @returns {boolean}
         * Returns `true` when the checkbox is currently checked, otherwise `false`.
         */
-       isChecked: function() {
+       isChecked() {
                return this.node.querySelector('input[type="checkbox"]').checked;
        },
 
        /** @override */
-       getValue: function() {
+       getValue() {
                return this.isChecked()
                        ? this.options.value_enabled
                        : this.options.value_disabled;
        },
 
        /** @override */
-       setValue: function(value) {
+       setValue(value) {
                this.node.querySelector('input[type="checkbox"]').checked = (value == this.options.value_enabled);
        }
 });
@@ -4353,7 +4353,7 @@ var UICheckbox = UIElement.extend(/** @lends LuCI.ui.Checkbox.prototype */ {
  * @param {LuCI.ui.Select.InitOptions} [options]
  * Object describing the widget specific options to initialize the inputs.
  */
-var UISelect = UIElement.extend(/** @lends LuCI.ui.Select.prototype */ {
+const UISelect = UIElement.extend(/** @lends LuCI.ui.Select.prototype */ {
        /**
         * In addition to the [AbstractElement.InitOptions]{@link LuCI.ui.AbstractElement.InitOptions}
         * the following properties are recognized:
@@ -4388,7 +4388,7 @@ var UISelect = UIElement.extend(/** @lends LuCI.ui.Select.prototype */ {
         * Specifies a placeholder text which is displayed when no choice is
         * selected yet. Only applicable to the `select` widget type.
         */
-       __init__: function(value, choices, options) {
+       __init__(value, choices, options) {
                if (!L.isObject(choices))
                        choices = {};
 
@@ -4411,9 +4411,9 @@ var UISelect = UIElement.extend(/** @lends LuCI.ui.Select.prototype */ {
        },
 
        /** @override */
-       render: function() {
-               var frameEl = E('div', { 'id': this.options.id }),
-                   keys = Object.keys(this.choices);
+       render() {
+               const frameEl = E('div', { 'id': this.options.id });
+               let keys = Object.keys(this.choices);
 
                if (this.options.sort === true)
                        keys.sort(L.naturalCompare);
@@ -4422,7 +4422,7 @@ var UISelect = UIElement.extend(/** @lends LuCI.ui.Select.prototype */ {
 
                if (this.options.widget != 'radio' &amp;&amp; this.options.widget != 'checkbox') {
                        frameEl.appendChild(E('select', {
-                               'id': this.options.id ? 'widget.' + this.options.id : null,
+                               'id': this.options.id ? `widget.${this.options.id}` : null,
                                'name': this.options.name,
                                'size': this.options.size,
                                'class': 'cbi-input-select',
@@ -4434,28 +4434,28 @@ var UISelect = UIElement.extend(/** @lends LuCI.ui.Select.prototype */ {
                                frameEl.lastChild.appendChild(E('option', {
                                        'value': '',
                                        'selected': (this.values.length == 0 || this.values[0] == '') ? '' : null
-                               }, [ this.choices[''] || this.options.placeholder || _('-- Please choose --') ]));
+                               }, [ this.choices[''] ?? this.options.placeholder ?? _('-- Please choose --') ]));
 
-                       for (var i = 0; i &lt; keys.length; i++) {
+                       for (let i = 0; i &lt; keys.length; i++) {
                                if (keys[i] == null || keys[i] == '')
                                        continue;
 
                                frameEl.lastChild.appendChild(E('option', {
                                        'value': keys[i],
                                        'selected': (this.values.indexOf(keys[i]) > -1) ? '' : null
-                               }, [ this.choices[keys[i]] || keys[i] ]));
+                               }, [ this.choices[keys[i]] ?? keys[i] ]));
                        }
                }
                else {
-                       var brEl = (this.options.orientation === 'horizontal') ? document.createTextNode(' \xa0 ') : E('br');
+                       const brEl = (this.options.orientation === 'horizontal') ? document.createTextNode(' \xa0 ') : E('br');
 
-                       for (var i = 0; i &lt; keys.length; i++) {
+                       for (let i = 0; i &lt; keys.length; i++) {
                                frameEl.appendChild(E('span', {
                                        'class': 'cbi-%s'.format(this.options.multiple ? 'checkbox' : 'radio')
                                }, [
                                        E('input', {
                                                'id': this.options.id ? 'widget.%s.%d'.format(this.options.id, i) : null,
-                                               'name': this.options.id || this.options.name,
+                                               'name': this.options.id ?? this.options.name,
                                                'type': this.options.multiple ? 'checkbox' : 'radio',
                                                'class': this.options.multiple ? 'cbi-input-checkbox' : 'cbi-input-radio',
                                                'value': keys[i],
@@ -4467,7 +4467,7 @@ var UISelect = UIElement.extend(/** @lends LuCI.ui.Select.prototype */ {
                                                'click': function(ev) {
                                                        ev.currentTarget.previousElementSibling.previousElementSibling.click();
                                                }
-                                       }, [ this.choices[keys[i]] || keys[i] ])
+                                       }, [ this.choices[keys[i]] ?? keys[i] ])
                                ]));
 
                                frameEl.appendChild(brEl.cloneNode());
@@ -4478,7 +4478,7 @@ var UISelect = UIElement.extend(/** @lends LuCI.ui.Select.prototype */ {
        },
 
        /** @private */
-       bind: function(frameEl) {
+       bind(frameEl) {
                this.node = frameEl;
 
                if (this.options.widget != 'radio' &amp;&amp; this.options.widget != 'checkbox') {
@@ -4486,8 +4486,8 @@ var UISelect = UIElement.extend(/** @lends LuCI.ui.Select.prototype */ {
                        this.setChangeEvents(frameEl.firstChild, 'change');
                }
                else {
-                       var radioEls = frameEl.querySelectorAll('input[type="radio"]');
-                       for (var i = 0; i &lt; radioEls.length; i++) {
+                       const radioEls = frameEl.querySelectorAll('input[type="radio"]');
+                       for (let i = 0; i &lt; radioEls.length; i++) {
                                this.setUpdateEvents(radioEls[i], 'change', 'click', 'blur');
                                this.setChangeEvents(radioEls[i], 'change', 'click', 'blur');
                        }
@@ -4499,12 +4499,12 @@ var UISelect = UIElement.extend(/** @lends LuCI.ui.Select.prototype */ {
        },
 
        /** @override */
-       getValue: function() {
+       getValue() {
                if (this.options.widget != 'radio' &amp;&amp; this.options.widget != 'checkbox')
                        return this.node.firstChild.value;
 
-               var radioEls = this.node.querySelectorAll('input[type="radio"]');
-               for (var i = 0; i &lt; radioEls.length; i++)
+               const radioEls = this.node.querySelectorAll('input[type="radio"]');
+               for (let i = 0; i &lt; radioEls.length; i++)
                        if (radioEls[i].checked)
                                return radioEls[i].value;
 
@@ -4512,19 +4512,19 @@ var UISelect = UIElement.extend(/** @lends LuCI.ui.Select.prototype */ {
        },
 
        /** @override */
-       setValue: function(value) {
+       setValue(value) {
                if (this.options.widget != 'radio' &amp;&amp; this.options.widget != 'checkbox') {
                        if (value == null)
                                value = '';
 
-                       for (var i = 0; i &lt; this.node.firstChild.options.length; i++)
+                       for (let i = 0; i &lt; this.node.firstChild.options.length; i++)
                                this.node.firstChild.options[i].selected = (this.node.firstChild.options[i].value == value);
 
                        return;
                }
 
-               var radioEls = frameEl.querySelectorAll('input[type="radio"]');
-               for (var i = 0; i &lt; radioEls.length; i++)
+               const radioEls = frameEl.querySelectorAll('input[type="radio"]');
+               for (let i = 0; i &lt; radioEls.length; i++)
                        radioEls[i].checked = (radioEls[i].value == value);
        }
 });
@@ -4561,7 +4561,7 @@ var UISelect = UIElement.extend(/** @lends LuCI.ui.Select.prototype */ {
  * @param {LuCI.ui.Dropdown.InitOptions} [options]
  * Object describing the widget specific options to initialize the dropdown.
  */
-var UIDropdown = UIElement.extend(/** @lends LuCI.ui.Dropdown.prototype */ {
+const UIDropdown = UIElement.extend(/** @lends LuCI.ui.Dropdown.prototype */ {
        /**
         * In addition to the [AbstractElement.InitOptions]{@link LuCI.ui.AbstractElement.InitOptions}
         * the following properties are recognized:
@@ -4658,7 +4658,7 @@ var UIDropdown = UIElement.extend(/** @lends LuCI.ui.Dropdown.prototype */ {
         * compatibility reasons. It is usually better to `maxlength(N)` validation
         * expression. Only applicable when `create` is `true`.
         */
-       __init__: function(value, choices, options) {
+       __init__(value, choices, options) {
                if (typeof(choices) != 'object')
                        choices = {};
 
@@ -4683,8 +4683,8 @@ var UIDropdown = UIElement.extend(/** @lends LuCI.ui.Dropdown.prototype */ {
        },
 
        /** @override */
-       render: function() {
-               var sb = E('div', {
+       render() {
+               const sb = E('div', {
                        'id': this.options.id,
                        'class': 'cbi-dropdown',
                        'multiple': this.options.multiple ? '' : null,
@@ -4693,7 +4693,7 @@ var UIDropdown = UIElement.extend(/** @lends LuCI.ui.Dropdown.prototype */ {
                        'tabindex': -1
                }, E('ul'));
 
-               var keys = Object.keys(this.choices);
+               let keys = Object.keys(this.choices);
 
                if (this.options.sort === true)
                        keys.sort(L.naturalCompare);
@@ -4701,12 +4701,12 @@ var UIDropdown = UIElement.extend(/** @lends LuCI.ui.Dropdown.prototype */ {
                        keys = this.options.sort;
 
                if (this.options.create)
-                       for (var i = 0; i &lt; this.values.length; i++)
+                       for (let i = 0; i &lt; this.values.length; i++)
                                if (!this.choices.hasOwnProperty(this.values[i]))
                                        keys.push(this.values[i]);
 
-               for (var i = 0; i &lt; keys.length; i++) {
-                       var label = this.choices[keys[i]];
+               for (let i = 0; i &lt; keys.length; i++) {
+                       let label = this.choices[keys[i]];
 
                        if (dom.elem(label))
                                label = label.cloneNode(true);
@@ -4714,20 +4714,20 @@ var UIDropdown = UIElement.extend(/** @lends LuCI.ui.Dropdown.prototype */ {
                        sb.lastElementChild.appendChild(E('li', {
                                'data-value': keys[i],
                                'selected': (this.values.indexOf(keys[i]) > -1) ? '' : null
-                       }, [ label || keys[i] ]));
+                       }, [ label ?? keys[i] ]));
                }
 
                if (this.options.create) {
-                       var createEl = E('input', {
+                       const createEl = E('input', {
                                'type': 'text',
                                'class': 'create-item-input',
                                'readonly': this.options.readonly ? '' : null,
                                'maxlength': this.options.maxlength,
-                               'placeholder': this.options.custom_placeholder || this.options.placeholder
+                               'placeholder': this.options.custom_placeholder ?? this.options.placeholder
                        });
 
                        if (this.options.datatype || this.options.validate)
-                               UI.prototype.addValidator(createEl, this.options.datatype || 'string',
+                               UI.prototype.addValidator(createEl, this.options.datatype ?? 'string',
                                                          true, this.options.validate, 'blur', 'keyup');
 
                        sb.lastElementChild.appendChild(E('li', { 'data-value': '-' }, createEl));
@@ -4741,29 +4741,29 @@ var UIDropdown = UIElement.extend(/** @lends LuCI.ui.Dropdown.prototype */ {
        },
 
        /** @private */
-       bind: function(sb) {
-               var o = this.options;
+       bind(sb) {
+               const o = this.options;
 
                o.multiple = sb.hasAttribute('multiple');
                o.optional = sb.hasAttribute('optional');
-               o.placeholder = sb.getAttribute('placeholder') || o.placeholder;
-               o.display_items = parseInt(sb.getAttribute('display-items') || o.display_items);
-               o.dropdown_items = parseInt(sb.getAttribute('dropdown-items') || o.dropdown_items);
-               o.create_query = sb.getAttribute('item-create') || o.create_query;
-               o.create_template = sb.getAttribute('item-template') || o.create_template;
-
-               var ul = sb.querySelector('ul'),
-                   more = sb.appendChild(E('span', { class: 'more', tabindex: -1 }, '···')),
-                   open = sb.appendChild(E('span', { class: 'open', tabindex: -1 }, '▾')),
-                   canary = sb.appendChild(E('div')),
-                   create = sb.querySelector(this.options.create_query),
-                   ndisplay = this.options.display_items,
-                   n = 0;
+               o.placeholder = sb.getAttribute('placeholder') ?? o.placeholder;
+               o.display_items = parseInt(sb.getAttribute('display-items') ?? o.display_items);
+               o.dropdown_items = parseInt(sb.getAttribute('dropdown-items') ?? o.dropdown_items);
+               o.create_query = sb.getAttribute('item-create') ?? o.create_query;
+               o.create_template = sb.getAttribute('item-template') ?? o.create_template;
+
+               const ul = sb.querySelector('ul');
+               const more = sb.appendChild(E('span', { class: 'more', tabindex: -1 }, '···'));
+               const open = sb.appendChild(E('span', { class: 'open', tabindex: -1 }, '▾'));
+               const canary = sb.appendChild(E('div'));
+               const create = sb.querySelector(this.options.create_query);
+               let ndisplay = this.options.display_items;
+               let n = 0;
 
                if (this.options.multiple) {
-                       var items = ul.querySelectorAll('li');
+                       let items = ul.querySelectorAll('li');
 
-                       for (var i = 0; i &lt; items.length; i++) {
+                       for (let i = 0; i &lt; items.length; i++) {
                                this.transformItem(sb, items[i]);
 
                                if (items[i].hasAttribute('selected') &amp;&amp; ndisplay-- > 0)
@@ -4772,22 +4772,22 @@ var UIDropdown = UIElement.extend(/** @lends LuCI.ui.Dropdown.prototype */ {
                }
                else {
                        if (this.options.optional &amp;&amp; !ul.querySelector('li[data-value=""]')) {
-                               var placeholder = E('li', { placeholder: '' },
-                                       this.options.select_placeholder || this.options.placeholder);
+                               const placeholder = E('li', { placeholder: '' },
+                                       this.options.select_placeholder ?? this.options.placeholder);
 
                                ul.firstChild
                                        ? ul.insertBefore(placeholder, ul.firstChild)
                                        : ul.appendChild(placeholder);
                        }
 
-                       var items = ul.querySelectorAll('li'),
-                           sel = sb.querySelectorAll('[selected]');
+                       let items = ul.querySelectorAll('li');
+                       const sel = sb.querySelectorAll('[selected]');
 
-                       sel.forEach(function(s) {
+                       sel.forEach(s => {
                                s.removeAttribute('selected');
                        });
 
-                       var s = sel[0] || items[0];
+                       const s = sel[0] ?? items[0];
                        if (s) {
                                s.setAttribute('selected', '');
                                s.setAttribute('display', n++);
@@ -4812,7 +4812,7 @@ var UIDropdown = UIElement.extend(/** @lends LuCI.ui.Dropdown.prototype */ {
                        sb.removeAttribute('empty');
 
                dom.content(more, (ndisplay == this.options.display_items)
-                       ? (this.options.select_placeholder || this.options.placeholder) : '···');
+                       ? (this.options.select_placeholder ?? this.options.placeholder) : '···');
 
 
                sb.addEventListener('click', this.handleClick.bind(this));
@@ -4821,7 +4821,7 @@ var UIDropdown = UIElement.extend(/** @lends LuCI.ui.Dropdown.prototype */ {
                sb.addEventListener('cbi-dropdown-select', this.handleDropdownSelect.bind(this));
 
                if ('ontouchstart' in window) {
-                       sb.addEventListener('touchstart', function(ev) { ev.stopPropagation(); });
+                       sb.addEventListener('touchstart', ev => ev.stopPropagation());
                        window.addEventListener('touchstart', this.closeAllDropdowns);
                }
                else {
@@ -4837,7 +4837,7 @@ var UIDropdown = UIElement.extend(/** @lends LuCI.ui.Dropdown.prototype */ {
                        create.addEventListener('focus', this.handleCreateFocus.bind(this));
                        create.addEventListener('blur', this.handleCreateBlur.bind(this));
 
-                       var li = findParent(create, 'li');
+                       const li = findParent(create, 'li');
 
                        li.setAttribute('unselectable', '');
                        li.addEventListener('click', this.handleCreateClick.bind(this));
@@ -4854,10 +4854,10 @@ var UIDropdown = UIElement.extend(/** @lends LuCI.ui.Dropdown.prototype */ {
        },
 
        /** @private */
-       getScrollParent: function(element) {
-               var parent = element,
-                   style = getComputedStyle(element),
-                   excludeStaticParent = (style.position === 'absolute');
+       getScrollParent(element) {
+               let parent = element;
+               let style = getComputedStyle(element);
+               const excludeStaticParent = (style.position === 'absolute');
 
                if (style.position === 'fixed')
                        return document.body;
@@ -4876,49 +4876,49 @@ var UIDropdown = UIElement.extend(/** @lends LuCI.ui.Dropdown.prototype */ {
        },
 
        /** @private */
-       openDropdown: function(sb) {
-               var st = window.getComputedStyle(sb, null),
-                   ul = sb.querySelector('ul'),
-                   li = ul.querySelectorAll('li'),
-                   fl = findParent(sb, '.cbi-value-field'),
-                   sel = ul.querySelector('[selected]'),
-                   rect = sb.getBoundingClientRect(),
-                   items = Math.min(this.options.dropdown_items, li.length),
-                   scrollParent = this.getScrollParent(sb);
-
-               document.querySelectorAll('.cbi-dropdown[open]').forEach(function(s) {
+       openDropdown(sb) {
+               const st = window.getComputedStyle(sb, null);
+               const ul = sb.querySelector('ul');
+               const li = ul.querySelectorAll('li');
+               const fl = findParent(sb, '.cbi-value-field');
+               const sel = ul.querySelector('[selected]');
+               const rect = sb.getBoundingClientRect();
+               const items = Math.min(this.options.dropdown_items, li.length);
+               const scrollParent = this.getScrollParent(sb);
+
+               document.querySelectorAll('.cbi-dropdown[open]').forEach(s => {
                        s.dispatchEvent(new CustomEvent('cbi-dropdown-close', {}));
                });
 
                sb.setAttribute('open', '');
 
-               var pv = ul.cloneNode(true);
+               const pv = ul.cloneNode(true);
                pv.classList.add('preview');
 
                if (fl)
                        fl.classList.add('cbi-dropdown-open');
 
                if ('ontouchstart' in window) {
-                       var vpWidth = Math.max(document.documentElement.clientWidth, window.innerWidth || 0),
-                           vpHeight = Math.max(document.documentElement.clientHeight, window.innerHeight || 0),
-                           start = null;
-
-                       ul.style.top = sb.offsetHeight + 'px';
-                       ul.style.left = -rect.left + 'px';
-                       ul.style.right = (rect.right - vpWidth) + 'px';
-                       ul.style.maxHeight = (vpHeight * 0.5) + 'px';
+                       const vpWidth = Math.max(document.documentElement.clientWidth, window.innerWidth ?? 0);
+                       const vpHeight = Math.max(document.documentElement.clientHeight, window.innerHeight ?? 0);
+                       let start = null;
+
+                       ul.style.top = `${sb.offsetHeight}px`;
+                       ul.style.left = `${-rect.left}px`;
+                       ul.style.right = `${rect.right - vpWidth}px`;
+                       ul.style.maxHeight = `${vpHeight * 0.5}px`;
                        ul.style.WebkitOverflowScrolling = 'touch';
 
-                       var scrollFrom = scrollParent.scrollTop,
-                           scrollTo = scrollFrom + rect.top - vpHeight * 0.5;
+                       const scrollFrom = scrollParent.scrollTop;
+                       const scrollTo = scrollFrom + rect.top - vpHeight * 0.5;
 
-                       var scrollStep = function(timestamp) {
+                       const scrollStep = timestamp => {
                                if (!start) {
                                        start = timestamp;
                                        ul.scrollTop = sel ? Math.max(sel.offsetTop - sel.offsetHeight, 0) : 0;
                                }
 
-                               var duration = Math.max(timestamp - start, 1);
+                               const duration = Math.max(timestamp - start, 1);
                                if (duration &lt; 100) {
                                        scrollParent.scrollTop = scrollFrom + (scrollTo - scrollFrom) * (duration / 100);
                                        window.requestAnimationFrame(scrollStep);
@@ -4934,73 +4934,73 @@ var UIDropdown = UIElement.extend(/** @lends LuCI.ui.Dropdown.prototype */ {
                        ul.style.maxHeight = '1px';
                        ul.style.top = ul.style.bottom = '';
 
-                       window.requestAnimationFrame(function() {
-                               var containerRect = scrollParent.getBoundingClientRect(),
-                                   itemHeight = li[Math.max(0, li.length - 2)].getBoundingClientRect().height,
-                                   fullHeight = 0,
-                                   spaceAbove = rect.top - containerRect.top,
-                                   spaceBelow = containerRect.bottom - rect.bottom;
+                       window.requestAnimationFrame(() => {
+                               const containerRect = scrollParent.getBoundingClientRect();
+                               const itemHeight = li[Math.max(0, li.length - 2)].getBoundingClientRect().height;
+                               let fullHeight = 0;
+                               const spaceAbove = rect.top - containerRect.top;
+                               const spaceBelow = containerRect.bottom - rect.bottom;
 
-                               for (var i = 0; i &lt; (items == -1 ? li.length : items); i++)
+                               for (let i = 0; i &lt; (items == -1 ? li.length : items); i++)
                                        fullHeight += li[i].getBoundingClientRect().height;
 
                                if (fullHeight &lt;= spaceBelow) {
-                                       ul.style.top = rect.height + 'px';
-                                       ul.style.maxHeight = spaceBelow + 'px';
+                                       ul.style.top = `${rect.height}px`;
+                                       ul.style.maxHeight = `${spaceBelow}px`;
                                }
                                else if (fullHeight &lt;= spaceAbove) {
-                                       ul.style.bottom = rect.height + 'px';
-                                       ul.style.maxHeight = spaceAbove + 'px';
+                                       ul.style.bottom = `${rect.height}px`;
+                                       ul.style.maxHeight = `${spaceAbove}px`;
                                }
                                else if (spaceBelow >= spaceAbove) {
-                                       ul.style.top = rect.height + 'px';
-                                       ul.style.maxHeight = (spaceBelow - (spaceBelow % itemHeight)) + 'px';
+                                       ul.style.top = `${rect.height}px`;
+                                       ul.style.maxHeight = `${spaceBelow - (spaceBelow % itemHeight)}px`;
                                }
                                else {
-                                       ul.style.bottom = rect.height + 'px';
-                                       ul.style.maxHeight = (spaceAbove - (spaceAbove % itemHeight)) + 'px';
+                                       ul.style.bottom = `${rect.height}px`;
+                                       ul.style.maxHeight = `${spaceAbove - (spaceAbove % itemHeight)}px`;
                                }
 
                                ul.scrollTop = sel ? Math.max(sel.offsetTop - sel.offsetHeight, 0) : 0;
                        });
                }
 
-               var cboxes = ul.querySelectorAll('[selected] input[type="checkbox"]');
-               for (var i = 0; i &lt; cboxes.length; i++) {
+               const cboxes = ul.querySelectorAll('[selected] input[type="checkbox"]');
+               for (let i = 0; i &lt; cboxes.length; i++) {
                        cboxes[i].checked = true;
                        cboxes[i].disabled = (cboxes.length == 1 &amp;&amp; !this.options.optional);
-               };
+               }
 
                ul.classList.add('dropdown');
 
                sb.insertBefore(pv, ul.nextElementSibling);
 
-               li.forEach(function(l) {
+               li.forEach(l => {
                        if (!l.hasAttribute('unselectable'))
                                l.setAttribute('tabindex', 0);
                });
 
                sb.lastElementChild.setAttribute('tabindex', 0);
 
-               var focusFn = L.bind(function(el) {
+               const focusFn = L.bind((el) => {
                        this.setFocus(sb, el, true);
                        ul.removeEventListener('transitionend', focusFn);
-               }, this, sel || li[0]);
+               }, this, sel ?? li[0]);
 
                ul.addEventListener('transitionend', focusFn);
        },
 
        /** @private */
-       closeDropdown: function(sb, no_focus) {
+       closeDropdown(sb, no_focus) {
                if (!sb.hasAttribute('open'))
                        return;
 
-               var pv = sb.querySelector('ul.preview'),
-                   ul = sb.querySelector('ul.dropdown'),
-                   li = ul.querySelectorAll('li'),
-                   fl = findParent(sb, '.cbi-value-field');
+               const pv = sb.querySelector('ul.preview');
+               const ul = sb.querySelector('ul.dropdown');
+               const li = ul.querySelectorAll('li');
+               const fl = findParent(sb, '.cbi-value-field');
 
-               li.forEach(function(l) { l.removeAttribute('tabindex'); });
+               li.forEach(l => l.removeAttribute('tabindex'));
                sb.lastElementChild.removeAttribute('tabindex');
 
                sb.removeChild(pv);
@@ -5020,20 +5020,20 @@ var UIDropdown = UIElement.extend(/** @lends LuCI.ui.Dropdown.prototype */ {
        },
 
        /** @private */
-       toggleItem: function(sb, li, force_state) {
-               var ul = li.parentNode;
+       toggleItem(sb, li, force_state) {
+               const ul = li.parentNode;
 
                if (li.hasAttribute('unselectable'))
                        return;
 
                if (this.options.multiple) {
-                       var cbox = li.querySelector('input[type="checkbox"]'),
-                           items = li.parentNode.querySelectorAll('li'),
-                           label = sb.querySelector('ul.preview'),
-                           sel = li.parentNode.querySelectorAll('[selected]').length,
-                           more = sb.querySelector('.more'),
-                           ndisplay = this.options.display_items,
-                           n = 0;
+                       const cbox = li.querySelector('input[type="checkbox"]');
+                       const items = li.parentNode.querySelectorAll('li');
+                       const label = sb.querySelector('ul.preview');
+                       let sel = li.parentNode.querySelectorAll('[selected]').length;
+                       const more = sb.querySelector('.more');
+                       let ndisplay = this.options.display_items;
+                       let n = 0;
 
                        if (li.hasAttribute('selected')) {
                                if (force_state !== true) {
@@ -5059,7 +5059,7 @@ var UIDropdown = UIElement.extend(/** @lends LuCI.ui.Dropdown.prototype */ {
                        while (label &amp;&amp; label.firstElementChild)
                                label.removeChild(label.firstElementChild);
 
-                       for (var i = 0; i &lt; items.length; i++) {
+                       for (let i = 0; i &lt; items.length; i++) {
                                items[i].removeAttribute('display');
                                if (items[i].hasAttribute('selected')) {
                                        if (ndisplay-- > 0) {
@@ -5067,7 +5067,7 @@ var UIDropdown = UIElement.extend(/** @lends LuCI.ui.Dropdown.prototype */ {
                                                if (label)
                                                        label.appendChild(items[i].cloneNode(true));
                                        }
-                                       var c = items[i].querySelector('input[type="checkbox"]');
+                                       const c = items[i].querySelector('input[type="checkbox"]');
                                        if (c)
                                                c.disabled = (sel == 1 &amp;&amp; !this.options.optional);
                                }
@@ -5084,10 +5084,10 @@ var UIDropdown = UIElement.extend(/** @lends LuCI.ui.Dropdown.prototype */ {
                                sb.removeAttribute('empty');
 
                        dom.content(more, (ndisplay === this.options.display_items)
-                               ? (this.options.select_placeholder || this.options.placeholder) : '···');
+                               ? (this.options.select_placeholder ?? this.options.placeholder) : '···');
                }
                else {
-                       var sel = li.parentNode.querySelector('[selected]');
+                       let sel = li.parentNode.querySelector('[selected]');
                        if (sel) {
                                sel.removeAttribute('display');
                                sel.removeAttribute('selected');
@@ -5103,9 +5103,9 @@ var UIDropdown = UIElement.extend(/** @lends LuCI.ui.Dropdown.prototype */ {
        },
 
        /** @private */
-       transformItem: function(sb, li) {
-               var cbox = E('form', {}, E('input', { type: 'checkbox', tabindex: -1, onclick: 'event.preventDefault()' })),
-                   label = E('label');
+       transformItem(sb, li) {
+               const cbox = E('form', {}, E('input', { type: 'checkbox', tabindex: -1, onclick: 'event.preventDefault()' }));
+               const label = E('label');
 
                while (li.firstChild)
                        label.appendChild(li.firstChild);
@@ -5115,21 +5115,21 @@ var UIDropdown = UIElement.extend(/** @lends LuCI.ui.Dropdown.prototype */ {
        },
 
        /** @private */
-       saveValues: function(sb, ul) {
-               var sel = ul.querySelectorAll('li[selected]'),
-                   div = sb.lastElementChild,
-                   name = this.options.name,
-                   strval = '',
-                   values = [];
+       saveValues(sb, ul) {
+               const sel = ul.querySelectorAll('li[selected]');
+               const div = sb.lastElementChild;
+               const name = this.options.name;
+               let strval = '';
+               const values = [];
 
                while (div.lastElementChild)
                        div.removeChild(div.lastElementChild);
 
-               sel.forEach(function (s) {
+               sel.forEach(s => {
                        if (s.hasAttribute('placeholder'))
                                return;
 
-                       var v = {
+                       const v = {
                                text: s.innerText,
                                value: s.hasAttribute('data-value') ? s.getAttribute('data-value') : s.innerText,
                                element: s
@@ -5143,10 +5143,10 @@ var UIDropdown = UIElement.extend(/** @lends LuCI.ui.Dropdown.prototype */ {
 
                        values.push(v);
 
-                       strval += strval.length ? ' ' + v.value : v.value;
+                       strval += strval.length ? ` ${v.value}` : v.value;
                });
 
-               var detail = {
+               const detail = {
                        instance: this,
                        element: sb
                };
@@ -5165,11 +5165,11 @@ var UIDropdown = UIElement.extend(/** @lends LuCI.ui.Dropdown.prototype */ {
        },
 
        /** @private */
-       setValues: function(sb, values) {
-               var ul = sb.querySelector('ul');
+       setValues(sb, values) {
+               const ul = sb.querySelector('ul');
 
                if (this.options.create) {
-                       for (var value in values) {
+                       for (const value in values) {
                                this.createItems(sb, value);
 
                                if (!this.options.multiple)
@@ -5178,9 +5178,9 @@ var UIDropdown = UIElement.extend(/** @lends LuCI.ui.Dropdown.prototype */ {
                }
 
                if (this.options.multiple) {
-                       var lis = ul.querySelectorAll('li[data-value]');
-                       for (var i = 0; i &lt; lis.length; i++) {
-                               var value = lis[i].getAttribute('data-value');
+                       const lis = ul.querySelectorAll('li[data-value]');
+                       for (let i = 0; i &lt; lis.length; i++) {
+                               const value = lis[i].getAttribute('data-value');
                                if (values === null || !(value in values))
                                        this.toggleItem(sb, lis[i], false);
                                else
@@ -5188,13 +5188,13 @@ var UIDropdown = UIElement.extend(/** @lends LuCI.ui.Dropdown.prototype */ {
                        }
                }
                else {
-                       var ph = ul.querySelector('li[placeholder]');
+                       const ph = ul.querySelector('li[placeholder]');
                        if (ph)
                                this.toggleItem(sb, ph);
 
-                       var lis = ul.querySelectorAll('li[data-value]');
-                       for (var i = 0; i &lt; lis.length; i++) {
-                               var value = lis[i].getAttribute('data-value');
+                       const lis = ul.querySelectorAll('li[data-value]');
+                       for (let i = 0; i &lt; lis.length; i++) {
+                               const value = lis[i].getAttribute('data-value');
                                if (values !== null &amp;&amp; (value in values))
                                        this.toggleItem(sb, lis[i]);
                        }
@@ -5202,11 +5202,11 @@ var UIDropdown = UIElement.extend(/** @lends LuCI.ui.Dropdown.prototype */ {
        },
 
        /** @private */
-       setFocus: function(sb, elem, scroll) {
+       setFocus(sb, elem, scroll) {
                if (sb.hasAttribute('locked-in'))
                        return;
 
-               sb.querySelectorAll('.focus').forEach(function(e) {
+               sb.querySelectorAll('.focus').forEach(e => {
                        e.classList.remove('focus');
                });
 
@@ -5219,20 +5219,34 @@ var UIDropdown = UIElement.extend(/** @lends LuCI.ui.Dropdown.prototype */ {
        },
 
        /** @private */
-       createChoiceElement: function(sb, value, label) {
-               var tpl = sb.querySelector(this.options.create_template),
-                   markup = null;
+       handleMouseout(ev) {
+               const sb = ev.currentTarget;
+
+               if (!sb.hasAttribute('open'))
+                       return;
+
+               sb.querySelectorAll('.focus').forEach(e => {
+                       e.classList.remove('focus');
+               });
+
+               sb.querySelector('ul.dropdown').focus();
+       },
+
+       /** @private */
+       createChoiceElement(sb, value, label) {
+               const tpl = sb.querySelector(this.options.create_template);
+               let markup = null;
 
                if (tpl)
-                       markup = (tpl.textContent || tpl.innerHTML || tpl.firstChild.data).replace(/^&lt;!--|--!?>$/, '').trim();
+                       markup = (tpl.textContent ?? tpl.innerHTML ?? tpl.firstChild.data).replace(/^&lt;!--|-->$/, '').trim();
                else
                        markup = '&lt;li data-value="{{value}}">&lt;span data-label-placeholder="true" />&lt;/li>';
 
-               var new_item = E(markup.replace(/{{value}}/g, '%h'.format(value))),
-                   placeholder = new_item.querySelector('[data-label-placeholder]');
+               const new_item = E(markup.replace(/{{value}}/g, '%h'.format(value)));
+               const placeholder = new_item.querySelector('[data-label-placeholder]');
 
                if (placeholder) {
-                       var content = E('span', {}, label || this.choices[value] || [ value ]);
+                       const content = E('span', {}, label ?? this.choices[value] ?? [ value ]);
 
                        while (content.firstChild)
                                placeholder.parentNode.insertBefore(content.firstChild, placeholder);
@@ -5250,20 +5264,20 @@ var UIDropdown = UIElement.extend(/** @lends LuCI.ui.Dropdown.prototype */ {
        },
 
        /** @private */
-       createItems: function(sb, value) {
-               var sbox = this,
-                   val = (value || '').trim(),
-                   ul = sb.querySelector('ul');
+       createItems(sb, value) {
+               const sbox = this;
+               let val = (value ?? '').trim();
+               const ul = sb.querySelector('ul');
 
                if (!sbox.options.multiple)
                        val = val.length ? [ val ] : [];
                else
                        val = val.length ? val.split(/\s+/) : [];
 
-               val.forEach(function(item) {
-                       var new_item = null;
+               val.forEach(item => {
+                       let new_item = null;
 
-                       ul.childNodes.forEach(function(li) {
+                       ul.childNodes.forEach(li => {
                                if (li.getAttribute &amp;&amp; li.getAttribute('data-value') === item)
                                        new_item = li;
                        });
@@ -5272,7 +5286,7 @@ var UIDropdown = UIElement.extend(/** @lends LuCI.ui.Dropdown.prototype */ {
                                new_item = sbox.createChoiceElement(sb, item);
 
                                if (!sbox.options.multiple) {
-                                       var old = ul.querySelector('li[created]');
+                                       const old = ul.querySelector('li[created]');
                                        if (old)
                                                ul.removeChild(old);
 
@@ -5300,14 +5314,14 @@ var UIDropdown = UIElement.extend(/** @lends LuCI.ui.Dropdown.prototype */ {
         * If set to `true`, deselect and remove selected choices as well instead
         * of keeping them.
         */
-       clearChoices: function(reset_value) {
-               var ul = this.node.querySelector('ul'),
-                   lis = ul ? ul.querySelectorAll('li[data-value]') : [],
-                   len = lis.length - (this.options.create ? 1 : 0),
-                   val = reset_value ? null : this.getValue();
-
-               for (var i = 0; i &lt; len; i++) {
-                       var lival = lis[i].getAttribute('data-value');
+       clearChoices(reset_value) {
+               const ul = this.node.querySelector('ul');
+               const lis = ul ? ul.querySelectorAll('li[data-value]') : [];
+               const len = lis.length - (this.options.create ? 1 : 0);
+               const val = reset_value ? null : this.getValue();
+
+               for (let i = 0; i &lt; len; i++) {
+                       const lival = lis[i].getAttribute('data-value');
                        if (val == null ||
                                (!this.options.multiple &amp;&amp; val != lival) ||
                                (this.options.multiple &amp;&amp; val.indexOf(lival) == -1))
@@ -5335,10 +5349,10 @@ var UIDropdown = UIElement.extend(/** @lends LuCI.ui.Dropdown.prototype */ {
         * as label text. Choice labels may be any valid value accepted by
         * {@link LuCI.dom#content}.
         */
-       addChoices: function(values, labels) {
-               var sb = this.node,
-                   ul = sb.querySelector('ul'),
-                   lis = ul ? ul.querySelectorAll('li[data-value]') : [];
+       addChoices(values, labels) {
+               const sb = this.node;
+               const ul = sb.querySelector('ul');
+               const lis = ul ? ul.querySelectorAll('li[data-value]') : [];
 
                if (!Array.isArray(values))
                        values = L.toArray(values);
@@ -5346,10 +5360,10 @@ var UIDropdown = UIElement.extend(/** @lends LuCI.ui.Dropdown.prototype */ {
                if (!L.isObject(labels))
                        labels = {};
 
-               for (var i = 0; i &lt; values.length; i++) {
-                       var found = false;
+               for (let i = 0; i &lt; values.length; i++) {
+                       let found = false;
 
-                       for (var j = 0; j &lt; lis.length; j++) {
+                       for (let j = 0; j &lt; lis.length; j++) {
                                if (lis[j].getAttribute('data-value') === values[i]) {
                                        found = true;
                                        break;
@@ -5368,22 +5382,22 @@ var UIDropdown = UIElement.extend(/** @lends LuCI.ui.Dropdown.prototype */ {
        /**
         * Close all open dropdown widgets in the current document.
         */
-       closeAllDropdowns: function() {
-               document.querySelectorAll('.cbi-dropdown[open]').forEach(function(s) {
+       closeAllDropdowns() {
+               document.querySelectorAll('.cbi-dropdown[open]').forEach(s => {
                        s.dispatchEvent(new CustomEvent('cbi-dropdown-close', {}));
                });
        },
 
        /** @private */
-       handleClick: function(ev) {
-               var sb = ev.currentTarget;
+       handleClick(ev) {
+               const sb = ev.currentTarget;
 
                if (!sb.hasAttribute('open')) {
                        if (!matchesElem(ev.target, 'input'))
                                this.openDropdown(sb);
                }
                else {
-                       var li = findParent(ev.target, 'li');
+                       const li = findParent(ev.target, 'li');
                        if (li &amp;&amp; li.parentNode.classList.contains('dropdown'))
                                this.toggleItem(sb, li);
                        else if (li &amp;&amp; li.parentNode.classList.contains('preview'))
@@ -5397,9 +5411,9 @@ var UIDropdown = UIElement.extend(/** @lends LuCI.ui.Dropdown.prototype */ {
        },
 
        /** @private */
-       handleKeydown: function(ev) {
-               var sb = ev.currentTarget,
-                   ul = sb.querySelector('ul.dropdown');
+       handleKeydown(ev) {
+               const sb = ev.currentTarget;
+               const ul = sb.querySelector('ul.dropdown');
 
                if (matchesElem(ev.target, 'input'))
                        return;
@@ -5415,7 +5429,7 @@ var UIDropdown = UIElement.extend(/** @lends LuCI.ui.Dropdown.prototype */ {
                        }
                }
                else {
-                       var active = findParent(document.activeElement, 'li');
+                       const active = findParent(document.activeElement, 'li');
 
                        switch (ev.keyCode) {
                        case 27:
@@ -5452,10 +5466,10 @@ var UIDropdown = UIElement.extend(/** @lends LuCI.ui.Dropdown.prototype */ {
 
                        case 40:
                                if (active &amp;&amp; active.nextElementSibling) {
-                                       var li = active.nextElementSibling;
+                                       const li = active.nextElementSibling;
                                        this.setFocus(sb, li);
                                        if (this.options.create &amp;&amp; li == li.parentNode.lastElementChild) {
-                                               var input = li.querySelector('input:not([type="hidden"]):not([type="checkbox"]');
+                                               const input = li.querySelector('input:not([type="hidden"]):not([type="checkbox"]');
                                                if (input) input.focus();
                                        }
                                        ev.preventDefault();
@@ -5470,16 +5484,16 @@ var UIDropdown = UIElement.extend(/** @lends LuCI.ui.Dropdown.prototype */ {
        },
 
        /** @private */
-       handleDropdownClose: function(ev) {
-               var sb = ev.currentTarget;
+       handleDropdownClose(ev) {
+               const sb = ev.currentTarget;
 
                this.closeDropdown(sb, true);
        },
 
        /** @private */
-       handleDropdownSelect: function(ev) {
-               var sb = ev.currentTarget,
-                   li = findParent(ev.target, 'li');
+       handleDropdownSelect(ev) {
+               const sb = ev.currentTarget;
+               const li = findParent(ev.target, 'li');
 
                if (!li)
                        return;
@@ -5489,25 +5503,38 @@ var UIDropdown = UIElement.extend(/** @lends LuCI.ui.Dropdown.prototype */ {
        },
 
        /** @private */
-       handleFocus: function(ev) {
-               var sb = ev.currentTarget;
+       handleMouseover(ev) {
+               const sb = ev.currentTarget;
+
+               if (!sb.hasAttribute('open'))
+                       return;
+
+               const li = findParent(ev.target, 'li');
+
+               if (li &amp;&amp; li.parentNode.classList.contains('dropdown'))
+                       this.setFocus(sb, li);
+       },
+
+       /** @private */
+       handleFocus(ev) {
+               const sb = ev.currentTarget;
 
-               document.querySelectorAll('.cbi-dropdown[open]').forEach(function(s) {
+               document.querySelectorAll('.cbi-dropdown[open]').forEach(s => {
                        if (s !== sb || sb.hasAttribute('open'))
                                s.dispatchEvent(new CustomEvent('cbi-dropdown-close', {}));
                });
        },
 
        /** @private */
-       handleCanaryFocus: function(ev) {
+       handleCanaryFocus(ev) {
                this.closeDropdown(ev.currentTarget.parentNode);
        },
 
        /** @private */
-       handleCreateKeydown: function(ev) {
-               var input = ev.currentTarget,
-                   li = findParent(input, 'li'),
-                   sb = findParent(li, '.cbi-dropdown');
+       handleCreateKeydown(ev) {
+               const input = ev.currentTarget;
+               const li = findParent(input, 'li');
+               const sb = findParent(li, '.cbi-dropdown');
 
                switch (ev.keyCode) {
                case 13:
@@ -5538,11 +5565,11 @@ var UIDropdown = UIElement.extend(/** @lends LuCI.ui.Dropdown.prototype */ {
        },
 
        /** @private */
-       handleCreateFocus: function(ev) {
-               var input = ev.currentTarget,
-                   li = findParent(input, 'li'),
-                   cbox = li.querySelector('input[type="checkbox"]'),
-                   sb = findParent(input, '.cbi-dropdown');
+       handleCreateFocus(ev) {
+               const input = ev.currentTarget;
+               const li = findParent(input, 'li');
+               const cbox = li.querySelector('input[type="checkbox"]');
+               const sb = findParent(input, '.cbi-dropdown');
 
                if (cbox)
                        cbox.checked = true;
@@ -5552,10 +5579,10 @@ var UIDropdown = UIElement.extend(/** @lends LuCI.ui.Dropdown.prototype */ {
        },
 
        /** @private */
-       handleCreateBlur: function(ev) {
-               var input = ev.currentTarget,
-                   cbox = findParent(input, 'li').querySelector('input[type="checkbox"]'),
-                   sb = findParent(input, '.cbi-dropdown');
+       handleCreateBlur(ev) {
+               const input = ev.currentTarget;
+               const cbox = findParent(input, 'li').querySelector('input[type="checkbox"]');
+               const sb = findParent(input, '.cbi-dropdown');
 
                if (cbox)
                        cbox.checked = false;
@@ -5564,25 +5591,25 @@ var UIDropdown = UIElement.extend(/** @lends LuCI.ui.Dropdown.prototype */ {
        },
 
        /** @private */
-       handleCreateClick: function(ev) {
+       handleCreateClick(ev) {
                ev.currentTarget.querySelector(this.options.create_query).focus();
        },
 
        /** @override */
-       setValue: function(values) {
+       setValue(values) {
                if (this.options.multiple) {
                        if (!Array.isArray(values))
                                values = (values != null &amp;&amp; values != '') ? [ values ] : [];
 
-                       var v = {};
+                       const v = {};
 
-                       for (var i = 0; i &lt; values.length; i++)
+                       for (let i = 0; i &lt; values.length; i++)
                                v[values[i]] = true;
 
                        this.setValues(this.node, v);
                }
                else {
-                       var v = {};
+                       const v = {};
 
                        if (values != null) {
                                if (Array.isArray(values))
@@ -5596,12 +5623,12 @@ var UIDropdown = UIElement.extend(/** @lends LuCI.ui.Dropdown.prototype */ {
        },
 
        /** @override */
-       getValue: function() {
-               var div = this.node.lastElementChild,
-                   h = div.querySelectorAll('input[type="hidden"]'),
-                       v = [];
+       getValue() {
+               const div = this.node.lastElementChild;
+               const h = div.querySelectorAll('input[type="hidden"]');
+               const v = [];
 
-               for (var i = 0; i &lt; h.length; i++)
+               for (let i = 0; i &lt; h.length; i++)
                        v.push(h[i].value);
 
                return this.options.multiple ? v : v[0];
@@ -5642,7 +5669,7 @@ var UIDropdown = UIElement.extend(/** @lends LuCI.ui.Dropdown.prototype */ {
  * @param {LuCI.ui.Combobox.InitOptions} [options]
  * Object describing the widget specific options to initialize the dropdown.
  */
-var UICombobox = UIDropdown.extend(/** @lends LuCI.ui.Combobox.prototype */ {
+const UICombobox = UIDropdown.extend(/** @lends LuCI.ui.Combobox.prototype */ {
        /**
         * Comboboxes support the same properties as
         * [Dropdown.InitOptions]{@link LuCI.ui.Dropdown.InitOptions} but enforce
@@ -5663,7 +5690,7 @@ var UICombobox = UIDropdown.extend(/** @lends LuCI.ui.Combobox.prototype */ {
         * Since Comboboxes are always optional, this property is forcibly set to
         * `true`.
         */
-       __init__: function(value, choices, options) {
+       __init__(value, choices, options) {
                this.super('__init__', [ value, choices, Object.assign({
                        select_placeholder: _('-- Please choose --'),
                        custom_placeholder: _('-- custom --'),
@@ -5709,7 +5736,7 @@ var UICombobox = UIDropdown.extend(/** @lends LuCI.ui.Combobox.prototype */ {
  * @param {LuCI.ui.ComboButton.InitOptions} [options]
  * Object describing the widget specific options to initialize the button.
  */
-var UIComboButton = UIDropdown.extend(/** @lends LuCI.ui.ComboButton.prototype */ {
+const UIComboButton = UIDropdown.extend(/** @lends LuCI.ui.ComboButton.prototype */ {
        /**
         * ComboButtons support the same properties as
         * [Dropdown.InitOptions]{@link LuCI.ui.Dropdown.InitOptions} but enforce
@@ -5746,7 +5773,7 @@ var UIComboButton = UIDropdown.extend(/** @lends LuCI.ui.ComboButton.prototype *
         * and receive the DOM click event as first as well as the selected action
         * choice value as second argument.
         */
-       __init__: function(value, choices, options) {
+       __init__(value, choices, options) {
                this.super('__init__', [ value, choices, Object.assign({
                        sort: true
                }, options, {
@@ -5757,35 +5784,35 @@ var UIComboButton = UIDropdown.extend(/** @lends LuCI.ui.ComboButton.prototype *
        },
 
        /** @override */
-       render: function(/* ... */) {
-               var node = UIDropdown.prototype.render.apply(this, arguments),
-                   val = this.getValue();
+       render(...args) {
+               const node = UIDropdown.prototype.render.call(this, ...args);
+               const val = this.getValue();
 
                if (L.isObject(this.options.classes) &amp;&amp; this.options.classes.hasOwnProperty(val))
-                       node.setAttribute('class', 'cbi-dropdown ' + this.options.classes[val]);
+                       node.setAttribute('class', `cbi-dropdown ${this.options.classes[val]}`);
 
                return node;
        },
 
        /** @private */
-       handleClick: function(ev) {
-               var sb = ev.currentTarget,
-                   t = ev.target;
+       handleClick(ev, ...args) {
+               const sb = ev.currentTarget;
+               const t = ev.target;
 
                if (sb.hasAttribute('open') || dom.matches(t, '.cbi-dropdown > span.open'))
-                       return UIDropdown.prototype.handleClick.apply(this, arguments);
+                       return UIDropdown.prototype.handleClick.call(this, ev, ...args);
 
                if (this.options.click)
                        return this.options.click.call(sb, ev, this.getValue());
        },
 
        /** @private */
-       toggleItem: function(sb /*, ... */) {
-               var rv = UIDropdown.prototype.toggleItem.apply(this, arguments),
-                   val = this.getValue();
+       toggleItem(sb, ...args) {
+               const rv = UIDropdown.prototype.toggleItem.call(this, sb, ...args);
+               const val = this.getValue();
 
                if (L.isObject(this.options.classes) &amp;&amp; this.options.classes.hasOwnProperty(val))
-                       sb.setAttribute('class', 'cbi-dropdown ' + this.options.classes[val]);
+                       sb.setAttribute('class', `cbi-dropdown ${this.options.classes[val]}`);
                else
                        sb.setAttribute('class', 'cbi-dropdown');
 
@@ -5828,7 +5855,7 @@ var UIComboButton = UIDropdown.extend(/** @lends LuCI.ui.ComboButton.prototype *
  * @param {LuCI.ui.DynamicList.InitOptions} [options]
  * Object describing the widget specific options to initialize the dynamic list.
  */
-var UIDynamicList = UIElement.extend(/** @lends LuCI.ui.DynamicList.prototype */ {
+const UIDynamicList = UIElement.extend(/** @lends LuCI.ui.DynamicList.prototype */ {
        /**
         * In case choices are passed to the dynamic list constructor, the widget
         * supports the same properties as [Dropdown.InitOptions]{@link LuCI.ui.Dropdown.InitOptions}
@@ -5846,7 +5873,7 @@ var UIDynamicList = UIElement.extend(/** @lends LuCI.ui.DynamicList.prototype */
         * predefined choice values, the dropdown must be made optional to allow
         * it to remain unselected.
         */
-       __init__: function(values, choices, options) {
+       __init__(values, choices, options) {
                if (!Array.isArray(values))
                        values = (values != null &amp;&amp; values != '') ? [ values ] : [];
 
@@ -5862,8 +5889,8 @@ var UIDynamicList = UIElement.extend(/** @lends LuCI.ui.DynamicList.prototype */
        },
 
        /** @override */
-       render: function() {
-               var dl = E('div', {
+       render() {
+               const dl = E('div', {
                        'id': this.options.id,
                        'class': 'cbi-dynlist',
                        'disabled': this.options.disabled ? '' : null
@@ -5873,13 +5900,13 @@ var UIDynamicList = UIElement.extend(/** @lends LuCI.ui.DynamicList.prototype */
                        if (this.options.placeholder != null)
                                this.options.select_placeholder = this.options.placeholder;
 
-                       var cbox = new UICombobox(null, this.choices, this.options);
+                       const cbox = new UICombobox(null, this.choices, this.options);
 
                        dl.lastElementChild.appendChild(cbox.render());
                }
                else {
-                       var inputEl = E('input', {
-                               'id': this.options.id ? 'widget.' + this.options.id : null,
+                       const inputEl = E('input', {
+                               'id': this.options.id ? `widget.${this.options.id}` : null,
                                'type': 'text',
                                'class': 'cbi-input-text',
                                'placeholder': this.options.placeholder,
@@ -5890,12 +5917,12 @@ var UIDynamicList = UIElement.extend(/** @lends LuCI.ui.DynamicList.prototype */
                        dl.lastElementChild.appendChild(E('div', { 'class': 'btn cbi-button cbi-button-add' }, '+'));
 
                        if (this.options.datatype || this.options.validate)
-                               UI.prototype.addValidator(inputEl, this.options.datatype || 'string',
+                               UI.prototype.addValidator(inputEl, this.options.datatype ?? 'string',
                                                          true, this.options.validate, 'blur', 'keyup');
                }
 
-               for (var i = 0; i &lt; this.values.length; i++) {
-                       var label = this.choices ? this.choices[this.values[i]] : null;
+               for (let i = 0; i &lt; this.values.length; i++) {
+                       let label = this.choices ? this.choices[this.values[i]] : null;
 
                        if (dom.elem(label))
                                label = label.cloneNode(true);
@@ -5909,7 +5936,7 @@ var UIDynamicList = UIElement.extend(/** @lends LuCI.ui.DynamicList.prototype */
        },
 
        /** @private */
-       initDragAndDrop: function(dl) {
+       initDragAndDrop(dl) {
                let draggedItem = null;
                let placeholder = null;
 
@@ -5996,7 +6023,7 @@ var UIDynamicList = UIElement.extend(/** @lends LuCI.ui.DynamicList.prototype */
        },
 
        /** @private */
-       bind: function(dl) {
+       bind(dl) {
                dl.addEventListener('click', L.bind(this.handleClick, this));
                dl.addEventListener('keydown', L.bind(this.handleKeydown, this));
                dl.addEventListener('cbi-dropdown-change', L.bind(this.handleDropdownChange, this));
@@ -6012,20 +6039,21 @@ var UIDynamicList = UIElement.extend(/** @lends LuCI.ui.DynamicList.prototype */
        },
 
        /** @private */
-       addItem: function(dl, value, text, flash) {
-               var exists = false,
-                   new_item = E('div', { 'class': flash ? 'item flash' : 'item', 'tabindex': 0, 'draggable': true }, [
-                               E('span', {}, [ text || value ]),
-                               E('input', {
-                                       'type': 'hidden',
-                                       'name': this.options.name,
-                                       'value': value })]);
+       addItem(dl, value, text, flash) {
+               let exists = false;
 
-               dl.querySelectorAll('.item').forEach(function(item) {
+               const new_item = E('div', { 'class': flash ? 'item flash' : 'item', 'tabindex': 0, 'draggable': true }, [
+                       E('span', {}, [ text ?? value ]),
+                       E('input', {
+                               'type': 'hidden',
+                               'name': this.options.name,
+                               'value': value })]);
+
+               dl.querySelectorAll('.item').forEach(item => {
                        if (exists)
                                return;
 
-                       var hidden = item.querySelector('input[type="hidden"]');
+                       let hidden = item.querySelector('input[type="hidden"]');
 
                        if (hidden &amp;&amp; hidden.parentNode !== item)
                                hidden = null;
@@ -6035,7 +6063,7 @@ var UIDynamicList = UIElement.extend(/** @lends LuCI.ui.DynamicList.prototype */
                });
 
                if (!exists) {
-                       var ai = dl.querySelector('.add-item');
+                       const ai = dl.querySelector('.add-item');
                        ai.parentNode.insertBefore(new_item, ai);
                }
 
@@ -6051,11 +6079,11 @@ var UIDynamicList = UIElement.extend(/** @lends LuCI.ui.DynamicList.prototype */
        },
 
        /** @private */
-       removeItem: function(dl, item) {
-               var value = item.querySelector('input[type="hidden"]').value;
-               var sb = dl.querySelector('.cbi-dropdown');
+       removeItem(dl, item) {
+               const value = item.querySelector('input[type="hidden"]').value;
+               const sb = dl.querySelector('.cbi-dropdown');
                if (sb)
-                       sb.querySelectorAll('ul > li').forEach(function(li) {
+                       sb.querySelectorAll('ul > li').forEach(li => {
                                if (li.getAttribute('data-value') === value) {
                                        if (li.hasAttribute('dynlistcustom'))
                                                li.parentNode.removeChild(li);
@@ -6078,20 +6106,20 @@ var UIDynamicList = UIElement.extend(/** @lends LuCI.ui.DynamicList.prototype */
        },
 
        /** @private */
-       handleClick: function(ev) {
-               var dl = ev.currentTarget,
-                   item = findParent(ev.target, '.item');
+       handleClick(ev) {
+               const dl = ev.currentTarget;
+               const item = findParent(ev.target, '.item');
 
                if (this.options.disabled)
                        return;
 
                if (item) {
                        // Get bounding rectangle of the item
-                       var rect = item.getBoundingClientRect();
+                       const rect = item.getBoundingClientRect();
 
                        // Get computed styles for the ::after pseudo-element
-                       var afterStyles = window.getComputedStyle(item, '::after');
-                       var afterWidth = parseFloat(afterStyles.width) || 0;
+                       const afterStyles = window.getComputedStyle(item, '::after');
+                       const afterWidth = parseFloat(afterStyles.width) || 0;
 
                        // Check if the click is within the ::after region
                        if (rect.right - ev.clientX &lt;= afterWidth) {
@@ -6099,7 +6127,7 @@ var UIDynamicList = UIElement.extend(/** @lends LuCI.ui.DynamicList.prototype */
                        }
                }
                else if (matchesElem(ev.target, '.cbi-button-add')) {
-                       var input = ev.target.previousElementSibling;
+                       const input = ev.target.previousElementSibling;
                        if (input.value.length &amp;&amp; !input.classList.contains('cbi-input-invalid')) {
                                this.addItem(dl, input.value, null, true);
                                input.value = '';
@@ -6108,11 +6136,11 @@ var UIDynamicList = UIElement.extend(/** @lends LuCI.ui.DynamicList.prototype */
        },
 
        /** @private */
-       handleDropdownChange: function(ev) {
-               var dl = ev.currentTarget,
-                   sbIn = ev.detail.instance,
-                   sbEl = ev.detail.element,
-                   sbVal = ev.detail.value;
+       handleDropdownChange(ev) {
+               const dl = ev.currentTarget;
+               const sbIn = ev.detail.instance;
+               const sbEl = ev.detail.element;
+               const sbVal = ev.detail.value;
 
                if (sbVal === null)
                        return;
@@ -6125,12 +6153,12 @@ var UIDynamicList = UIElement.extend(/** @lends LuCI.ui.DynamicList.prototype */
                        sbVal.element.setAttribute('dynlistcustom', '');
                }
 
-               var label = sbVal.text;
+               let label = sbVal.text;
 
                if (sbVal.element) {
                        label = E([]);
 
-                       for (var i = 0; i &lt; sbVal.element.childNodes.length; i++)
+                       for (let i = 0; i &lt; sbVal.element.childNodes.length; i++)
                                label.appendChild(sbVal.element.childNodes[i].cloneNode(true));
                }
 
@@ -6138,9 +6166,9 @@ var UIDynamicList = UIElement.extend(/** @lends LuCI.ui.DynamicList.prototype */
        },
 
        /** @private */
-       handleKeydown: function(ev) {
-               var dl = ev.currentTarget,
-                   item = findParent(ev.target, '.item');
+       handleKeydown(ev) {
+               const dl = ev.currentTarget;
+               const item = findParent(ev.target, '.item');
 
                if (item) {
                        switch (ev.keyCode) {
@@ -6180,34 +6208,34 @@ var UIDynamicList = UIElement.extend(/** @lends LuCI.ui.DynamicList.prototype */
        },
 
        /** @override */
-       getValue: function() {
-               var items = this.node.querySelectorAll('.item > input[type="hidden"]'),
-                   input = this.node.querySelector('.add-item > input[type="text"]'),
-                   v = [];
+       getValue() {
+               const items = this.node.querySelectorAll('.item > input[type="hidden"]');
+               const input = this.node.querySelector('.add-item > input[type="text"]');
+               const v = [];
 
-               for (var i = 0; i &lt; items.length; i++)
+               for (let i = 0; i &lt; items.length; i++)
                        v.push(items[i].value);
 
                if (input &amp;&amp; input.value != null &amp;&amp; input.value.match(/\S/) &amp;&amp;
                    input.classList.contains('cbi-input-invalid') == false &amp;&amp;
-                   v.filter(function(s) { return s == input.value }).length == 0)
+                   v.filter(s => s == input.value).length == 0)
                        v.push(input.value);
 
                return v;
        },
 
        /** @override */
-       setValue: function(values) {
+       setValue(values) {
                if (!Array.isArray(values))
                        values = (values != null &amp;&amp; values != '') ? [ values ] : [];
 
-               var items = this.node.querySelectorAll('.item');
+               const items = this.node.querySelectorAll('.item');
 
-               for (var i = 0; i &lt; items.length; i++)
+               for (let i = 0; i &lt; items.length; i++)
                        if (items[i].parentNode === this.node)
                                this.removeItem(this.node, items[i]);
 
-               for (var i = 0; i &lt; values.length; i++)
+               for (let i = 0; i &lt; values.length; i++)
                        this.addItem(this.node, values[i],
                                this.choices ? this.choices[values[i]] : null);
        },
@@ -6229,8 +6257,8 @@ var UIDynamicList = UIElement.extend(/** @lends LuCI.ui.DynamicList.prototype */
         * as label text. Choice labels may be any valid value accepted by
         * {@link LuCI.dom#content}.
         */
-       addChoices: function(values, labels) {
-               var dl = this.node.lastElementChild.firstElementChild;
+       addChoices(values, labels) {
+               const dl = this.node.lastElementChild.firstElementChild;
                dom.callClassMethod(dl, 'addChoices', values, labels);
        },
 
@@ -6242,8 +6270,8 @@ var UIDynamicList = UIElement.extend(/** @lends LuCI.ui.DynamicList.prototype */
         * @instance
         * @memberof LuCI.ui.DynamicList
         */
-       clearChoices: function() {
-               var dl = this.node.lastElementChild.firstElementChild;
+       clearChoices() {
+               const dl = this.node.lastElementChild.firstElementChild;
                dom.callClassMethod(dl, 'clearChoices');
        }
 });
@@ -6275,8 +6303,8 @@ var UIDynamicList = UIElement.extend(/** @lends LuCI.ui.DynamicList.prototype */
  * @param {LuCI.ui.AbstractElement.InitOptions} [options]
  * Object describing the widget specific options to initialize the hidden input.
  */
-var UIHiddenfield = UIElement.extend(/** @lends LuCI.ui.Hiddenfield.prototype */ {
-       __init__: function(value, options) {
+const UIHiddenfield = UIElement.extend(/** @lends LuCI.ui.Hiddenfield.prototype */ {
+       __init__(value, options) {
                this.value = value;
                this.options = Object.assign({
 
@@ -6284,8 +6312,8 @@ var UIHiddenfield = UIElement.extend(/** @lends LuCI.ui.Hiddenfield.prototype */
        },
 
        /** @override */
-       render: function() {
-               var hiddenEl = E('input', {
+       render() {
+               const hiddenEl = E('input', {
                        'id': this.options.id,
                        'type': 'hidden',
                        'value': this.value
@@ -6295,7 +6323,7 @@ var UIHiddenfield = UIElement.extend(/** @lends LuCI.ui.Hiddenfield.prototype */
        },
 
        /** @private */
-       bind: function(hiddenEl) {
+       bind(hiddenEl) {
                this.node = hiddenEl;
 
                dom.bindClassInstance(hiddenEl, this);
@@ -6304,12 +6332,12 @@ var UIHiddenfield = UIElement.extend(/** @lends LuCI.ui.Hiddenfield.prototype */
        },
 
        /** @override */
-       getValue: function() {
+       getValue() {
                return this.node.value;
        },
 
        /** @override */
-       setValue: function(value) {
+       setValue(value) {
                this.node.value = value;
        }
 });
@@ -6342,7 +6370,7 @@ var UIHiddenfield = UIElement.extend(/** @lends LuCI.ui.Hiddenfield.prototype */
  * Object describing the widget specific options to initialize the file
  * upload control.
  */
-var UIFileUpload = UIElement.extend(/** @lends LuCI.ui.FileUpload.prototype */ {
+const UIFileUpload = UIElement.extend(/** @lends LuCI.ui.FileUpload.prototype */ {
        /**
         * In addition to the [AbstractElement.InitOptions]{@link LuCI.ui.AbstractElement.InitOptions}
         * the following properties are recognized:
@@ -6383,7 +6411,7 @@ var UIFileUpload = UIElement.extend(/** @lends LuCI.ui.FileUpload.prototype */ {
         * Whether remote directories are browsable or not solely depends on the
         * ACL setup for the current session.
         */
-       __init__: function(value, options) {
+       __init__(value, options) {
                this.value = value;
                this.options = Object.assign({
                        browser: false,
@@ -6396,7 +6424,7 @@ var UIFileUpload = UIElement.extend(/** @lends LuCI.ui.FileUpload.prototype */ {
        },
 
        /** @private */
-       bind: function(browserEl) {
+       bind(browserEl) {
                this.node = browserEl;
 
                this.setUpdateEvents(browserEl, 'cbi-fileupload-select', 'cbi-fileupload-cancel');
@@ -6408,9 +6436,9 @@ var UIFileUpload = UIElement.extend(/** @lends LuCI.ui.FileUpload.prototype */ {
        },
 
        /** @override */
-       render: function() {
-               var renderFileBrowser = L.resolveDefault(this.value != null ? fs.stat(this.value) : null).then(L.bind(function(stat) {
-                       var label;
+       render() {
+               const renderFileBrowser = L.resolveDefault(this.value != null ? fs.stat(this.value) : null).then(L.bind((stat) => {
+                       let label;
 
                        if (L.isObject(stat) &amp;&amp; stat.type != 'directory')
                                this.stat = stat;
@@ -6426,7 +6454,7 @@ var UIFileUpload = UIElement.extend(/** @lends LuCI.ui.FileUpload.prototype */ {
                                'click': UI.prototype.createHandlerFn(this, 'handleFileBrowser'),
                                'disabled': this.options.disabled ? '' : null
                        }, label);
-                       var fileBrowserEl = E('div', { 'id': this.options.id }, [
+                       const fileBrowserEl = E('div', { 'id': this.options.id }, [
                                btnOpenFileBrowser,
                                E('div', {
                                        'class': 'cbi-filebrowser'
@@ -6441,8 +6469,8 @@ var UIFileUpload = UIElement.extend(/** @lends LuCI.ui.FileUpload.prototype */ {
                }, this));
                // in a browser mode open dir listing after render by clicking on a Select button
                if (this.options.browser) {
-                       return renderFileBrowser.then(function (fileBrowserEl) {
-                               var btnOpenFileBrowser = fileBrowserEl.getElementsByClassName('open-file-browser').item(0);
+                       return renderFileBrowser.then((fileBrowserEl) => {
+                               const btnOpenFileBrowser = fileBrowserEl.getElementsByClassName('open-file-browser').item(0);
                                btnOpenFileBrowser.click();
                                return fileBrowserEl;
                        });
@@ -6451,15 +6479,15 @@ var UIFileUpload = UIElement.extend(/** @lends LuCI.ui.FileUpload.prototype */ {
        },
 
        /** @private */
-       truncatePath: function(path) {
+       truncatePath(path) {
                if (path.length > 50)
-                       path = path.substring(0, 25) + '…' + path.substring(path.length - 25);
+                       path = `${path.substring(0, 25)}…${path.substring(path.length - 25)}`;
 
                return path;
        },
 
        /** @private */
-       iconForType: function(type) {
+       iconForType(type) {
                switch (type) {
                case 'symlink':
                        return E('img', {
@@ -6488,7 +6516,7 @@ var UIFileUpload = UIElement.extend(/** @lends LuCI.ui.FileUpload.prototype */ {
        },
 
        /** @private */
-       canonicalizePath: function(path) {
+       canonicalizePath(path) {
                return path.replace(/\/{2,}/, '/')
                        .replace(/\/\.(\/|$)/g, '/')
                        .replace(/[^\/]+\/\.\.(\/|$)/g, '/')
@@ -6496,9 +6524,9 @@ var UIFileUpload = UIElement.extend(/** @lends LuCI.ui.FileUpload.prototype */ {
        },
 
        /** @private */
-       splitPath: function(path) {
-               var croot = this.canonicalizePath(this.options.root_directory || '/'),
-                   cpath = this.canonicalizePath(path || '/');
+       splitPath(path) {
+               const croot = this.canonicalizePath(this.options.root_directory ?? '/');
+               const cpath = this.canonicalizePath(path ?? '/');
 
                if (cpath.length &lt;= croot.length)
                        return [ croot ];
@@ -6506,7 +6534,7 @@ var UIFileUpload = UIElement.extend(/** @lends LuCI.ui.FileUpload.prototype */ {
                if (cpath.charAt(croot.length) != '/')
                        return [ croot ];
 
-               var parts = cpath.substring(croot.length + 1).split(/\//);
+               const parts = cpath.substring(croot.length + 1).split(/\//);
 
                parts.unshift(croot);
 
@@ -6514,36 +6542,36 @@ var UIFileUpload = UIElement.extend(/** @lends LuCI.ui.FileUpload.prototype */ {
        },
 
        /** @private */
-       handleUpload: function(path, list, ev) {
-               var form = ev.target.parentNode,
-                   fileinput = form.querySelector('input[type="file"]'),
-                   nameinput = form.querySelector('input[type="text"]'),
-                   filename = (nameinput.value != null ? nameinput.value : '').trim();
+       handleUpload(path, list, ev) {
+               const form = ev.target.parentNode;
+               const fileinput = form.querySelector('input[type="file"]');
+               const nameinput = form.querySelector('input[type="text"]');
+               const filename = (nameinput.value != null ? nameinput.value : '').trim();
 
                ev.preventDefault();
 
                if (filename == '' || filename.match(/\//) || fileinput.files[0] == null)
                        return;
 
-               var existing = list.filter(function(e) { return e.name == filename })[0];
+               const existing = list.filter(e => e.name == filename)[0];
 
                if (existing != null &amp;&amp; existing.type == 'directory')
                        return alert(_('A directory with the same name already exists.'));
                else if (existing != null &amp;&amp; !confirm(_('Overwrite existing file "%s" ?').format(filename)))
                        return;
 
-               var data = new FormData();
+               const data = new FormData();
 
                data.append('sessionid', L.env.sessionid);
-               data.append('filename', path + '/' + filename);
+               data.append('filename', `${path}/${filename}`);
                data.append('filedata', fileinput.files[0]);
 
-               return request.post(L.env.cgi_base + '/cgi-upload', data, {
-                       progress: L.bind(function(btn, ev) {
+               return request.post(`${L.env.cgi_base}/cgi-upload`, data, {
+                       progress: L.bind((btn, ev) => {
                                btn.firstChild.data = '%.2f%%'.format((ev.loaded / ev.total) * 100);
                        }, this, ev.target)
-               }).then(L.bind(function(path, ev, res) {
-                       var reply = res.json();
+               }).then(L.bind((path, ev, res) => {
+                       const reply = res.json();
 
                        if (L.isObject(reply) &amp;&amp; reply.failure)
                                alert(_('Upload request failed: %s').format(reply.message));
@@ -6553,10 +6581,10 @@ var UIFileUpload = UIElement.extend(/** @lends LuCI.ui.FileUpload.prototype */ {
        },
 
        /** @private */
-       handleDelete: function(path, fileStat, ev) {
-               var parent = path.replace(/\/[^\/]+$/, '') || '/',
-                   name = path.replace(/^.+\//, ''),
-                   msg;
+       handleDelete(path, fileStat, ev) {
+               const parent = path.replace(/\/[^\/]+$/, '') ?? '/';
+               const name = path.replace(/^.+\//, '');
+               let msg;
 
                ev.preventDefault();
 
@@ -6566,24 +6594,24 @@ var UIFileUpload = UIElement.extend(/** @lends LuCI.ui.FileUpload.prototype */ {
                        msg = _('Do you really want to delete "%s" ?').format(name);
 
                if (confirm(msg)) {
-                       var button = this.node.firstElementChild,
-                           hidden = this.node.lastElementChild;
+                       const button = this.node.firstElementChild;
+                       const hidden = this.node.lastElementChild;
 
                        if (path == hidden.value) {
                                dom.content(button, _('Select file…'));
                                hidden.value = '';
                        }
 
-                       return fs.remove(path).then(L.bind(function(parent, ev) {
+                       return fs.remove(path).then(L.bind((parent, ev) => {
                                return this.handleSelect(parent, null, ev);
-                       }, this, parent, ev)).catch(function(err) {
+                       }, this, parent, ev)).catch(err => {
                                alert(_('Delete request failed: %s').format(err.message));
                        });
                }
        },
 
        /** @private */
-       renderUpload: function(path, list) {
+       renderUpload(path, list) {
                if (!this.options.enable_upload)
                        return E([]);
 
@@ -6592,8 +6620,8 @@ var UIFileUpload = UIElement.extend(/** @lends LuCI.ui.FileUpload.prototype */ {
                                'href': '#',
                                'class': 'btn cbi-button-positive',
                                'click': function(ev) {
-                                       var uploadForm = ev.target.nextElementSibling,
-                                           fileInput = uploadForm.querySelector('input[type="file"]');
+                                       const uploadForm = ev.target.nextElementSibling;
+                                       const fileInput = uploadForm.querySelector('input[type="file"]');
 
                                        ev.target.style.display = 'none';
                                        uploadForm.style.display = '';
@@ -6605,8 +6633,8 @@ var UIFileUpload = UIElement.extend(/** @lends LuCI.ui.FileUpload.prototype */ {
                                        'type': 'file',
                                        'style': 'display:none',
                                        'change': function(ev) {
-                                               var nameinput = ev.target.parentNode.querySelector('input[type="text"]'),
-                                                   uploadbtn = ev.target.parentNode.querySelector('button.cbi-button-save');
+                                               const nameinput = ev.target.parentNode.querySelector('input[type="text"]');
+                                               const uploadbtn = ev.target.parentNode.querySelector('button.cbi-button-save');
 
                                                nameinput.value = ev.target.value.replace(/^.+[\/\\]/, '');
                                                uploadbtn.disabled = false;
@@ -6630,22 +6658,22 @@ var UIFileUpload = UIElement.extend(/** @lends LuCI.ui.FileUpload.prototype */ {
        },
 
        /** @private */
-       renderListing: function(container, path, list) {
-               var breadcrumb = E('p'),
-                   rows = E('ul');
+       renderListing(container, path, list) {
+               const breadcrumb = E('p');
+               const rows = E('ul');
 
-               list.sort(function(a, b) {
+               list.sort((a, b) => {
                        return L.naturalCompare(a.type == 'directory', b.type == 'directory') ||
-                              L.naturalCompare(a.name, b.name);
+                                  L.naturalCompare(a.name, b.name);
                });
 
-               for (var i = 0; i &lt; list.length; i++) {
+               for (let i = 0; i &lt; list.length; i++) {
                        if (!this.options.show_hidden &amp;&amp; list[i].name.charAt(0) == '.')
                                continue;
 
-                       var entrypath = this.canonicalizePath(path + '/' + list[i].name),
-                           selected = (entrypath == this.node.lastElementChild.value),
-                           mtime = new Date(list[i].mtime * 1000);
+                       const entrypath = this.canonicalizePath(`${path}/${list[i].name}`);
+                       const selected = (entrypath == this.node.lastElementChild.value);
+                       const mtime = new Date(list[i].mtime * 1000);
 
                        rows.appendChild(E('li', [
                                E('div', { 'class': 'name' }, [
@@ -6687,16 +6715,16 @@ var UIFileUpload = UIElement.extend(/** @lends LuCI.ui.FileUpload.prototype */ {
                if (!rows.firstElementChild)
                        rows.appendChild(E('em', _('No entries in this directory')));
 
-               var dirs = this.splitPath(path),
-                   cur = '';
+               const dirs = this.splitPath(path);
+               let cur = '';
 
-               for (var i = 0; i &lt; dirs.length; i++) {
-                       cur = cur ? cur + '/' + dirs[i] : dirs[i];
+               for (let i = 0; i &lt; dirs.length; i++) {
+                       cur = cur ? `${cur}/${dirs[i]}` : dirs[i];
                        dom.append(breadcrumb, [
                                i ? ' » ' : '',
                                E('a', {
                                        'href': '#',
-                                       'click': UI.prototype.createHandlerFn(this, 'handleSelect', cur || '/', null)
+                                       'click': UI.prototype.createHandlerFn(this, 'handleSelect', cur ?? '/', null)
                                }, dirs[i] != '' ? '%h'.format(dirs[i]) : E('em', '(root)')),
                        ]);
                }
@@ -6716,9 +6744,9 @@ var UIFileUpload = UIElement.extend(/** @lends LuCI.ui.FileUpload.prototype */ {
        },
 
        /** @private */
-       handleCancel: function(ev) {
-               var button = this.node.firstElementChild,
-                   browser = button.nextElementSibling;
+       handleCancel(ev) {
+               const button = this.node.firstElementChild;
+               const browser = button.nextElementSibling;
 
                browser.classList.remove('open');
                button.style.display = '';
@@ -6729,9 +6757,9 @@ var UIFileUpload = UIElement.extend(/** @lends LuCI.ui.FileUpload.prototype */ {
        },
 
        /** @private */
-       handleReset: function(ev) {
-               var button = this.node.firstElementChild,
-                   hidden = this.node.lastElementChild;
+       handleReset(ev) {
+               const button = this.node.firstElementChild;
+               const hidden = this.node.lastElementChild;
 
                hidden.value = '';
                dom.content(button, _('Select file…'));
@@ -6740,33 +6768,33 @@ var UIFileUpload = UIElement.extend(/** @lends LuCI.ui.FileUpload.prototype */ {
        },
 
        /** @private */
-       handleDownload: function(path, fileStat, ev) {
-               fs.read_direct(path, 'blob').then(function (blob) {
-                       var url = window.URL.createObjectURL(blob);
-                       var a = document.createElement('a');
+       handleDownload(path, fileStat, ev) {
+               fs.read_direct(path, 'blob').then((blob) => {
+                       const url = window.URL.createObjectURL(blob);
+                       let a = document.createElement('a');
                        a.style.display = 'none';
                        a.href = url;
                        a.download = fileStat.name;
                        document.body.appendChild(a);
                        a.click();
                        window.URL.revokeObjectURL(url);
-               }).catch(function(err) {
+               }).catch((err) => {
                        alert(_('Download failed: %s').format(err.message));
                });
        },
 
        /** @private */
-       handleSelect: function(path, fileStat, ev) {
-               var browser = dom.parent(ev.target, '.cbi-filebrowser'),
-                   ul = browser.querySelector('ul');
+       handleSelect(path, fileStat, ev) {
+               const browser = dom.parent(ev.target, '.cbi-filebrowser');
+               const ul = browser.querySelector('ul');
 
                if (fileStat == null) {
                        dom.content(ul, E('em', { 'class': 'spinning' }, _('Loading directory contents…')));
                        L.resolveDefault(fs.list(path), []).then(L.bind(this.renderListing, this, browser, path));
                }
                else if (!this.options.browser) {
-                       var button = this.node.firstElementChild,
-                           hidden = this.node.lastElementChild;
+                       const button = this.node.firstElementChild;
+                       const hidden = this.node.lastElementChild;
 
                        path = this.canonicalizePath(path);
 
@@ -6785,18 +6813,18 @@ var UIFileUpload = UIElement.extend(/** @lends LuCI.ui.FileUpload.prototype */ {
        },
 
        /** @private */
-       handleFileBrowser: function(ev) {
-               var button = ev.target,
-                   browser = button.nextElementSibling,
-                   path = this.stat ? this.stat.path.replace(/\/[^\/]+$/, '') : (this.options.initial_directory || this.options.root_directory);
+       handleFileBrowser(ev) {
+               const button = ev.target;
+               const browser = button.nextElementSibling;
+               let path = this.stat ? this.stat.path.replace(/\/[^\/]+$/, '') : (this.options.initial_directory ?? this.options.root_directory);
 
                if (path.indexOf(this.options.root_directory) != 0)
                        path = this.options.root_directory;
 
                ev.preventDefault();
 
-               return L.resolveDefault(fs.list(path), []).then(L.bind(function(button, browser, path, list) {
-                       document.querySelectorAll('.cbi-filebrowser.open').forEach(function(browserEl) {
+               return L.resolveDefault(fs.list(path), []).then(L.bind((button, browser, path, list) => {
+                       document.querySelectorAll('.cbi-filebrowser.open').forEach(browserEl => {
                                dom.findClassInstance(browserEl).handleCancel(ev);
                        });
 
@@ -6808,36 +6836,36 @@ var UIFileUpload = UIElement.extend(/** @lends LuCI.ui.FileUpload.prototype */ {
        },
 
        /** @override */
-       getValue: function() {
+       getValue() {
                return this.node.lastElementChild.value;
        },
 
        /** @override */
-       setValue: function(value) {
+       setValue(value) {
                this.node.lastElementChild.value = value;
        }
 });
 
 
 function scrubMenu(node) {
-       var hasSatisfiedChild = false;
+       let hasSatisfiedChild = false;
 
        if (L.isObject(node.children)) {
-               for (var k in node.children) {
-                       var child = scrubMenu(node.children[k]);
+               for (const k in node.children) {
+                       const child = scrubMenu(node.children[k]);
 
                        if (child.title &amp;&amp; !child.firstchild_ineligible)
-                               hasSatisfiedChild = hasSatisfiedChild || child.satisfied;
+                               hasSatisfiedChild ||= child.satisfied;
                }
        }
 
        if (L.isObject(node.action) &amp;&amp;
-           node.action.type == 'firstchild' &amp;&amp;
-           hasSatisfiedChild == false)
+               node.action.type == 'firstchild' &amp;&amp;
+               hasSatisfiedChild == false)
                node.satisfied = false;
 
        return node;
-};
+}
 
 /**
  * Handle menu.
@@ -6849,7 +6877,7 @@ function scrubMenu(node) {
  *
  * Handles menus.
  */
-var UIMenu = baseclass.singleton(/** @lends LuCI.ui.menu.prototype */ {
+const UIMenu = baseclass.singleton(/** @lends LuCI.ui.menu.prototype */ {
        /**
         * @typedef {Object} MenuNode
         * @memberof LuCI.ui.menu
@@ -6868,12 +6896,12 @@ var UIMenu = baseclass.singleton(/** @lends LuCI.ui.menu.prototype */ {
         * @returns {Promise&lt;LuCI.ui.menu.MenuNode>}
         * Returns a promise resolving to the root element of the menu tree.
         */
-       load: function() {
+       load() {
                if (this.menu == null)
                        this.menu = session.getLocalData('menu');
 
                if (!L.isObject(this.menu)) {
-                       this.menu = request.get(L.url('admin/menu')).then(L.bind(function(menu) {
+                       this.menu = request.get(L.url('admin/menu')).then(L.bind((menu) => {
                                this.menu = scrubMenu(menu.json());
                                session.setLocalData('menu', this.menu);
 
@@ -6888,7 +6916,7 @@ var UIMenu = baseclass.singleton(/** @lends LuCI.ui.menu.prototype */ {
         * Flush the internal menu cache to force loading a new structure on the
         * next page load.
         */
-       flushCache: function() {
+       flushCache() {
                session.setLocalData('menu', null);
        },
 
@@ -6900,13 +6928,13 @@ var UIMenu = baseclass.singleton(/** @lends LuCI.ui.menu.prototype */ {
         * @returns {LuCI.ui.menu.MenuNode[]}
         * Returns an array of child menu nodes.
         */
-       getChildren: function(node) {
-               var children = [];
+       getChildren(node) {
+               const children = [];
 
                if (node == null)
                        node = this.menu;
 
-               for (var k in node.children) {
+               for (const k in node.children) {
                        if (!node.children.hasOwnProperty(k))
                                continue;
 
@@ -6916,14 +6944,14 @@ var UIMenu = baseclass.singleton(/** @lends LuCI.ui.menu.prototype */ {
                        if (!node.children[k].hasOwnProperty('title'))
                                continue;
 
-                       var subnode = Object.assign(node.children[k], { name: k });
+                       let subnode = Object.assign(node.children[k], { name: k });
 
                        if (L.isObject(subnode.action) &amp;&amp; subnode.action.path != null &amp;&amp;
-                           (subnode.action.type == 'alias' || subnode.action.type == 'rewrite')) {
-                               var root = this.menu,
-                                   path = subnode.action.path.split('/');
+                               (subnode.action.type == 'alias' || subnode.action.type == 'rewrite')) {
+                               let root = this.menu;
+                               const path = subnode.action.path.split('/');
 
-                               for (var i = 0; root != null &amp;&amp; i &lt; path.length; i++)
+                               for (let i = 0; root != null &amp;&amp; i &lt; path.length; i++)
                                        root = L.isObject(root.children) ? root.children[path[i]] : null;
 
                                if (root)
@@ -6936,9 +6964,9 @@ var UIMenu = baseclass.singleton(/** @lends LuCI.ui.menu.prototype */ {
                        children.push(subnode);
                }
 
-               return children.sort(function(a, b) {
-                       var wA = a.order || 1000,
-                           wB = b.order || 1000;
+               return children.sort((a, b) => {
+                       const wA = a.order ?? 1000;
+                       const wB = b.order ?? 1000;
 
                        if (wA != wB)
                                return wA - wB;
@@ -6948,17 +6976,17 @@ var UIMenu = baseclass.singleton(/** @lends LuCI.ui.menu.prototype */ {
        }
 });
 
-var UITable = baseclass.extend(/** @lends LuCI.ui.table.prototype */ {
-       __init__: function(captions, options, placeholder) {
+const UITable = baseclass.extend(/** @lends LuCI.ui.table.prototype */ {
+       __init__(captions, options, placeholder) {
                if (!Array.isArray(captions)) {
                        this.initFromMarkup(captions);
 
                        return;
                }
 
-               var id = options.id || 'table%08x'.format(Math.random() * 0xffffffff);
+               const id = options.id ?? 'table%08x'.format(Math.random() * 0xffffffff);
 
-               var table = E('table', { 'id': id, 'class': 'table' }, [
+               const table = E('table', { 'id': id, 'class': 'table' }, [
                        E('tr', { 'class': 'tr table-titles', 'click': UI.prototype.createHandlerFn(this, 'handleSort') })
                ]);
 
@@ -6966,13 +6994,13 @@ var UITable = baseclass.extend(/** @lends LuCI.ui.table.prototype */ {
                this.node = table
                this.options = options;
 
-               var sorting = this.getActiveSortState();
+               const sorting = this.getActiveSortState();
 
-               for (var i = 0; i &lt; captions.length; i++) {
+               for (let i = 0; i &lt; captions.length; i++) {
                        if (captions[i] == null)
                                continue;
 
-                       var th = E('th', { 'class': 'th' }, [ captions[i] ]);
+                       const th = E('th', { 'class': 'th' }, [ captions[i] ]);
 
                        if (typeof(options.captionClasses) == 'object')
                                DOMTokenList.prototype.add.apply(th.classList, L.toArray(options.captionClasses[i]));
@@ -6988,8 +7016,8 @@ var UITable = baseclass.extend(/** @lends LuCI.ui.table.prototype */ {
                }
 
                if (placeholder) {
-                       var trow = table.appendChild(E('tr', { 'class': 'tr placeholder' })),
-                           td = trow.appendChild(E('td', { 'class': 'td' }, placeholder));
+                       const trow = table.appendChild(E('tr', { 'class': 'tr placeholder' }));
+                       const td = trow.appendChild(E('td', { 'class': 'td' }, placeholder));
 
                        if (typeof(captionClasses) == 'object')
                                DOMTokenList.prototype.add.apply(td.classList, L.toArray(captionClasses[0]));
@@ -6998,30 +7026,21 @@ var UITable = baseclass.extend(/** @lends LuCI.ui.table.prototype */ {
                DOMTokenList.prototype.add.apply(table.classList, L.toArray(options.classes));
        },
 
-       update: function(data, placeholder) {
-               var placeholder = placeholder || this.options.placeholder || _('No data', 'empty table placeholder'),
-                   sorting = this.getActiveSortState();
+       update(data, placeholderText) {
+               const placeholder = placeholderText ?? this.options.placeholder ?? _('No data', 'empty table placeholder');
+               const sorting = this.getActiveSortState();
 
                if (!Array.isArray(data))
                        return;
 
-               this.data = data;
-               this.placeholder = placeholder;
-
-               var n = 0,
-                   rows = this.node.querySelectorAll('tr, .tr'),
-                   trows = [],
-                   headings = [].slice.call(this.node.firstElementChild.querySelectorAll('th, .th')),
-                   captionClasses = this.options.captionClasses,
-                   trTag = (rows[0] &amp;&amp; rows[0].nodeName == 'DIV') ? 'div' : 'tr',
-                   tdTag = (headings[0] &amp;&amp; headings[0].nodeName == 'DIV') ? 'div' : 'td';
+               const headings = [].slice.call(this.node.firstElementChild.querySelectorAll('th, .th'));
 
                if (sorting) {
-                       var list = data.map(L.bind(function(row) {
+                       const list = data.map(L.bind((row) => {
                                return [ this.deriveSortKey(row[sorting[0]], sorting[0]), row ];
                        }, this));
 
-                       list.sort(function(a, b) {
+                       list.sort((a, b) => {
                                return sorting[1]
                                        ? -L.naturalCompare(a[0], b[0])
                                        : L.naturalCompare(a[0], b[0]);
@@ -7029,11 +7048,11 @@ var UITable = baseclass.extend(/** @lends LuCI.ui.table.prototype */ {
 
                        data.length = 0;
 
-                       list.forEach(function(item) {
+                       list.forEach(item => {
                                data.push(item[1]);
                        });
 
-                       headings.forEach(function(th, i) {
+                       headings.forEach((th, i) => {
                                if (i == sorting[0])
                                        th.setAttribute('data-sort-direction', sorting[1] ? 'desc' : 'asc');
                                else
@@ -7041,14 +7060,24 @@ var UITable = baseclass.extend(/** @lends LuCI.ui.table.prototype */ {
                        });
                }
 
-               data.forEach(function(row) {
+               this.data = data;
+               this.placeholder = placeholder;
+
+               let n = 0;
+               const rows = this.node.querySelectorAll('tr, .tr');
+               const trows = [];
+               const captionClasses = this.options.captionClasses;
+               const trTag = (rows[0] &amp;&amp; rows[0].nodeName == 'DIV') ? 'div' : 'tr';
+               const tdTag = (headings[0] &amp;&amp; headings[0].nodeName == 'DIV') ? 'div' : 'td';
+
+               data.forEach(row => {
                        trows[n] = E(trTag, { 'class': 'tr' });
 
-                       for (var i = 0; i &lt; headings.length; i++) {
-                               var text = (headings[i].innerText || '').trim();
-                               var raw_val = Array.isArray(row[i]) ? row[i][0] : null;
-                               var disp_val = Array.isArray(row[i]) ? row[i][1] : row[i];
-                               var td = trows[n].appendChild(E(tdTag, {
+                       for (let i = 0; i &lt; headings.length; i++) {
+                               const text = (headings[i].innerText ?? '').trim();
+                               const raw_val = Array.isArray(row[i]) ? row[i][0] : null;
+                               const disp_val = Array.isArray(row[i]) ? row[i][1] : row[i];
+                               const td = trows[n].appendChild(E(tdTag, {
                                        'class': 'td',
                                        'data-title': (text !== '') ? text : null,
                                        'data-value': raw_val
@@ -7064,7 +7093,7 @@ var UITable = baseclass.extend(/** @lends LuCI.ui.table.prototype */ {
                        trows[n].classList.add('cbi-rowstyle-%d'.format((n++ % 2) ? 2 : 1));
                });
 
-               for (var i = 0; i &lt; n; i++) {
+               for (let i = 0; i &lt; n; i++) {
                        if (rows[i+1])
                                this.node.replaceChild(trows[i], rows[i+1]);
                        else
@@ -7075,8 +7104,8 @@ var UITable = baseclass.extend(/** @lends LuCI.ui.table.prototype */ {
                        this.node.removeChild(rows[n]);
 
                if (placeholder &amp;&amp; this.node.firstElementChild === this.node.lastElementChild) {
-                       var trow = this.node.appendChild(E(trTag, { 'class': 'tr placeholder' })),
-                           td = trow.appendChild(E(tdTag, { 'class': 'td' }, placeholder));
+                       const trow = this.node.appendChild(E(trTag, { 'class': 'tr placeholder' }));
+                       const td = trow.appendChild(E(tdTag, { 'class': 'td' }, placeholder));
 
                        if (typeof(captionClasses) == 'object')
                                DOMTokenList.prototype.add.apply(td.classList, L.toArray(captionClasses[0]));
@@ -7085,32 +7114,32 @@ var UITable = baseclass.extend(/** @lends LuCI.ui.table.prototype */ {
                return this.node;
        },
 
-       render: function() {
+       render() {
                return this.node;
        },
 
        /** @private */
-       initFromMarkup: function(node) {
+       initFromMarkup(node) {
                if (!dom.elem(node))
                        node = document.querySelector(node);
 
                if (!node)
                        throw 'Invalid table selector';
 
-               var options = {},
-                   headrow = node.querySelector('tr, .tr');
+               const options = {};
+               const headrow = node.querySelector('tr, .tr');
 
                if (!headrow)
                        return;
 
                options.id = node.id;
-               options.classes = [].slice.call(node.classList).filter(function(c) { return c != 'table' });
+               options.classes = [].slice.call(node.classList).filter(c => c != 'table');
                options.sortable = [];
                options.captionClasses = [];
 
-               headrow.querySelectorAll('th, .th').forEach(function(th, i) {
+               headrow.querySelectorAll('th, .th').forEach((th, i) => {
                        options.sortable[i] = !th.classList.contains('cbi-section-actions');
-                       options.captionClasses[i] = [].slice.call(th.classList).filter(function(c) { return c != 'th' });
+                       options.captionClasses[i] = [].slice.call(th.classList).filter(c => c != 'th');
                });
 
                headrow.addEventListener('click', UI.prototype.createHandlerFn(this, 'handleSort'));
@@ -7121,9 +7150,10 @@ var UITable = baseclass.extend(/** @lends LuCI.ui.table.prototype */ {
        },
 
        /** @private */
-       deriveSortKey: function(value, index) {
-               var opts = this.options || {},
-                   hint, m;
+       deriveSortKey(value, index) {
+               const opts = this.options ?? {};
+               let hint;
+               let m;
 
                if (opts.sortable == true || opts.sortable == null)
                        hint = 'auto';
@@ -7134,16 +7164,17 @@ var UITable = baseclass.extend(/** @lends LuCI.ui.table.prototype */ {
                        if (value.hasAttribute('data-value'))
                                value = value.getAttribute('data-value');
                        else
-                               value = (value.innerText || '').trim();
+                               value = (value.innerText ?? '').trim();
                }
 
-               switch (hint || 'auto') {
+               switch (hint ?? 'auto') {
                case true:
                case 'auto':
                        m = /^([0-9a-fA-F:.]+)(?:\/([0-9a-fA-F:.]+))?$/.exec(value);
 
                        if (m) {
-                               var addr, mask;
+                               let addr;
+                               let mask;
 
                                addr = validation.parseIPv6(m[1]);
                                mask = m[2] ? validation.parseIPv6(m[2]) : null;
@@ -7198,16 +7229,16 @@ var UITable = baseclass.extend(/** @lends LuCI.ui.table.prototype */ {
        },
 
        /** @private */
-       getActiveSortState: function() {
+       getActiveSortState() {
                if (this.sortState)
                        return this.sortState;
 
                if (!this.options.id)
                        return null;
 
-               var page = document.body.getAttribute('data-page'),
-                   key = page + '.' + this.options.id,
-                   state = session.getLocalData('tablesort');
+               const page = document.body.getAttribute('data-page');
+               const key = `${page}.${this.id}`;
+               const state = session.getLocalData('tablesort');
 
                if (L.isObject(state) &amp;&amp; Array.isArray(state[key]))
                        return state[key];
@@ -7216,15 +7247,15 @@ var UITable = baseclass.extend(/** @lends LuCI.ui.table.prototype */ {
        },
 
        /** @private */
-       setActiveSortState: function(index, descending) {
+       setActiveSortState(index, descending) {
                this.sortState = [ index, descending ];
 
                if (!this.options.id)
                        return;
 
-               var page = document.body.getAttribute('data-page'),
-                   key = page + '.' + this.options.id,
-                   state = session.getLocalData('tablesort');
+               const page = document.body.getAttribute('data-page');
+               const key = `${page}.${this.options.id}`;
+               let state = session.getLocalData('tablesort');
 
                if (!L.isObject(state))
                        state = {};
@@ -7235,17 +7266,19 @@ var UITable = baseclass.extend(/** @lends LuCI.ui.table.prototype */ {
        },
 
        /** @private */
-       handleSort: function(ev) {
+       handleSort(ev) {
                if (!ev.target.matches('th[data-sortable-row]'))
                        return;
 
-               var index, direction;
+               const th = ev.target;
+               const direction = (th.getAttribute('data-sort-direction') == 'asc');
+               let index = 0;
 
-               this.node.firstElementChild.querySelectorAll('th, .th').forEach(function(th, i) {
-                       if (th === ev.target) {
+               this.node.firstElementChild.querySelectorAll('th').forEach((other_th, i) => {
+                       if (other_th !== th)
+                               other_th.removeAttribute('data-sort-direction');
+                       else
                                index = i;
-                               direction = th.getAttribute('data-sort-direction') == 'asc';
-                       }
                });
 
                this.setActiveSortState(index, direction);
@@ -7263,8 +7296,8 @@ var UITable = baseclass.extend(/** @lends LuCI.ui.table.prototype */ {
  * To import the class in views, use `'require ui'`, to import it in
  * external JavaScript, use `L.require("ui").then(...)`.
  */
-var UI = baseclass.extend(/** @lends LuCI.ui.prototype */ {
-       __init__: function() {
+const UI = baseclass.extend(/** @lends LuCI.ui.prototype */ {
+       __init__() {
                modalDiv = document.body.appendChild(
                        dom.create('div', {
                                id: 'modal_overlay',
@@ -7327,13 +7360,11 @@ var UI = baseclass.extend(/** @lends LuCI.ui.prototype */ {
         * @returns {Node}
         * Returns a DOM Node representing the modal dialog element.
         */
-       showModal: function(title, children /* , ... */) {
-               var dlg = modalDiv.firstElementChild;
+       showModal(title, children, ...classes) {
+               const dlg = modalDiv.firstElementChild;
 
                dlg.setAttribute('class', 'modal');
-
-               for (var i = 2; i &lt; arguments.length; i++)
-                       dlg.classList.add(arguments[i]);
+               dlg.classList.add(...classes);
 
                dom.content(dlg, dom.create('h4', {}, title));
                dom.append(dlg, children);
@@ -7355,15 +7386,15 @@ var UI = baseclass.extend(/** @lends LuCI.ui.prototype */ {
         * will not invoke other class functions so it is suitable to be used as event
         * handler as-is without the need to bind it first.
         */
-       hideModal: function() {
+       hideModal() {
                document.body.classList.remove('modal-overlay-active');
                modalDiv.blur();
        },
 
        /** @private */
-       cancelModal: function(ev) {
+       cancelModal(ev) {
                if (ev.key == 'Escape') {
-                       var btn = modalDiv.querySelector('.right > button, .right > .btn, .button-row > .btn');
+                       const btn = modalDiv.querySelector('.right > button, .right > .btn, .button-row > .btn');
 
                        if (btn)
                                btn.click();
@@ -7371,8 +7402,8 @@ var UI = baseclass.extend(/** @lends LuCI.ui.prototype */ {
        },
 
        /** @private */
-       showTooltip: function(ev) {
-               var target = findParent(ev.target, '[data-tooltip]');
+       showTooltip(ev) {
+               const target = findParent(ev.target, '[data-tooltip]');
 
                if (!target)
                        return;
@@ -7382,10 +7413,10 @@ var UI = baseclass.extend(/** @lends LuCI.ui.prototype */ {
                        tooltipTimeout = null;
                }
 
-               var rect = target.getBoundingClientRect(),
-                   x = rect.left              + window.pageXOffset,
-                   y = rect.top + rect.height + window.pageYOffset,
-                   above = false;
+               const rect = target.getBoundingClientRect();
+               const x = rect.left              + window.pageXOffset;
+               let y = rect.top + rect.height + window.pageYOffset;
+               let above = false;
 
                tooltipDiv.className = 'cbi-tooltip';
                tooltipDiv.innerHTML = '▲ ';
@@ -7397,18 +7428,18 @@ var UI = baseclass.extend(/** @lends LuCI.ui.prototype */ {
                if ((y + tooltipDiv.offsetHeight) > (window.innerHeight + window.pageYOffset))
                        above = true;
 
-               var dropdown = target.querySelector('ul.dropdown[style]:first-child');
+               const dropdown = target.querySelector('ul.dropdown[style]:first-child');
 
                if (dropdown &amp;&amp; dropdown.style.top)
                        above = true;
 
                if (above) {
                        y -= (tooltipDiv.offsetHeight + target.offsetHeight);
-                       tooltipDiv.firstChild.data = '▼ ' + tooltipDiv.firstChild.data.substr(2);
+                       tooltipDiv.firstChild.data = `▼ ${tooltipDiv.firstChild.data.substr(2)}`;
                }
 
-               tooltipDiv.style.top = y + 'px';
-               tooltipDiv.style.left = x + 'px';
+               tooltipDiv.style.top = `${y}px`;
+               tooltipDiv.style.left = `${x}px`;
                tooltipDiv.style.opacity = 1;
 
                tooltipDiv.dispatchEvent(new CustomEvent('tooltip-open', {
@@ -7418,7 +7449,7 @@ var UI = baseclass.extend(/** @lends LuCI.ui.prototype */ {
        },
 
        /** @private */
-       hideTooltip: function(ev) {
+       hideTooltip(ev) {
                if (ev.target === tooltipDiv || ev.relatedTarget === tooltipDiv ||
                    tooltipDiv.contains(ev.target) || tooltipDiv.contains(ev.relatedTarget))
                        return;
@@ -7429,7 +7460,7 @@ var UI = baseclass.extend(/** @lends LuCI.ui.prototype */ {
                }
 
                tooltipDiv.style.opacity = 0;
-               tooltipTimeout = window.setTimeout(function() { tooltipDiv.removeAttribute('style'); }, 250);
+               tooltipTimeout = window.setTimeout(() => tooltipDiv.removeAttribute('style'), 250);
 
                tooltipDiv.dispatchEvent(new CustomEvent('tooltip-close', { bubbles: true }));
        },
@@ -7469,13 +7500,13 @@ var UI = baseclass.extend(/** @lends LuCI.ui.prototype */ {
         * @returns {Node}
         * Returns a DOM Node representing the notification banner element.
         */
-       addNotification: function(title, children, timeout, ...classes) {
-               var mc = document.querySelector('#maincontent') || document.body;
-               var msg = E('div', {
+       addNotification(title, children, timeout, ...classes) {
+               const mc = document.querySelector('#maincontent') ?? document.body;
+               const msg = E('div', {
                        'class': 'alert-message fade-in',
                        'style': 'display:flex',
                        'transitionend': function(ev) {
-                               var node = ev.currentTarget;
+                               const node = ev.currentTarget;
                                if (node.parentNode &amp;&amp; node.classList.contains('fade-out'))
                                        node.parentNode.removeChild(node);
                        }
@@ -7498,12 +7529,12 @@ var UI = baseclass.extend(/** @lends LuCI.ui.prototype */ {
 
                dom.append(msg.firstElementChild, children);
 
-               classes.forEach(cls => msg.classList.add(cls));
+               msg.classList.add(...classes);
 
                mc.insertBefore(msg, mc.firstElementChild);
 
                function fadeOutNotification(element) {
-                       var notification = dom.parent(element, '.alert-message');
+                       const notification = dom.parent(element, '.alert-message');
                        if (notification) {
                                notification.classList.add('fade-out');
                                notification.classList.remove('fade-in');
@@ -7516,7 +7547,7 @@ var UI = baseclass.extend(/** @lends LuCI.ui.prototype */ {
                }
 
                if (typeof timeout === 'number' &amp;&amp; timeout > 0) {
-                       setTimeout(function() {
+                       setTimeout(() => {
                                if (msg &amp;&amp; msg.parentNode) {
                                        fadeOutNotification(msg);
                                }
@@ -7561,7 +7592,7 @@ var UI = baseclass.extend(/** @lends LuCI.ui.prototype */ {
         * Returns `true` when the indicator has been updated or `false` when no
         * changes were made.
         */
-       showIndicator: function(id, label, handler, style) {
+       showIndicator(id, label, handler, style) {
                if (indicatorDiv == null) {
                        indicatorDiv = document.body.querySelector('#indicators');
 
@@ -7569,11 +7600,11 @@ var UI = baseclass.extend(/** @lends LuCI.ui.prototype */ {
                                return false;
                }
 
-               var handlerFn = (typeof(handler) == 'function') ? handler : null,
-                   indicatorElem = indicatorDiv.querySelector('span[data-indicator="%s"]'.format(id));
+               const handlerFn = (typeof(handler) == 'function') ? handler : null;
+               let indicatorElem = indicatorDiv.querySelector('span[data-indicator="%s"]'.format(id));
 
                if (indicatorElem == null) {
-                       var beforeElem = null;
+                       let beforeElem = null;
 
                        for (beforeElem = indicatorDiv.firstElementChild;
                             beforeElem != null;
@@ -7609,8 +7640,8 @@ var UI = baseclass.extend(/** @lends LuCI.ui.prototype */ {
         * Returns `true` when the indicator has been removed or `false` when the
         * requested indicator was not found.
         */
-       hideIndicator: function(id) {
-               var indicatorElem = indicatorDiv ? indicatorDiv.querySelector('span[data-indicator="%s"]'.format(id)) : null;
+       hideIndicator(id) {
+               const indicatorElem = indicatorDiv ? indicatorDiv.querySelector('span[data-indicator="%s"]'.format(id)) : null;
 
                if (indicatorElem == null)
                        return false;
@@ -7652,19 +7683,19 @@ var UI = baseclass.extend(/** @lends LuCI.ui.prototype */ {
         * @returns {Node}
         * Returns the parent DOM node the formatted markup has been added to.
         */
-       itemlist: function(node, items, separators) {
-               var children = [];
+       itemlist(node, items, separators) {
+               const children = [];
 
                if (!Array.isArray(separators))
-                       separators = [ separators || E('br') ];
+                       separators = [ separators ?? E('br') ];
 
-               for (var i = 0; i &lt; items.length; i += 2) {
+               for (let i = 0; i &lt; items.length; i += 2) {
                        if (items[i+1] !== null &amp;&amp; items[i+1] !== undefined) {
-                               var sep = separators[(i/2) % separators.length],
-                                   cld = [];
+                               const sep = separators[(i/2) % separators.length];
+                               const cld = [];
 
                                children.push(E('span', { class: 'nowrap' }, [
-                                       items[i] ? E('strong', items[i] + ': ') : '',
+                                       items[i] ? E('strong', `${items[i]}: `) : '',
                                        items[i+1]
                                ]));
 
@@ -7695,11 +7726,13 @@ var UI = baseclass.extend(/** @lends LuCI.ui.prototype */ {
         */
        tabs: baseclass.singleton(/* @lends LuCI.ui.tabs.prototype */ {
                /** @private */
-               init: function() {
-                       var groups = [], prevGroup = null, currGroup = null;
+               init() {
+                       const groups = [];
+                       let prevGroup = null;
+                       let currGroup = null;
 
-                       document.querySelectorAll('[data-tab]').forEach(function(tab) {
-                               var parent = tab.parentNode;
+                       document.querySelectorAll('[data-tab]').forEach(tab => {
+                               const parent = tab.parentNode;
 
                                if (dom.matches(tab, 'li') &amp;&amp; dom.matches(parent, 'ul.cbi-tabmenu'))
                                        return;
@@ -7719,7 +7752,7 @@ var UI = baseclass.extend(/** @lends LuCI.ui.prototype */ {
                                groups[currGroup].push(tab);
                        });
 
-                       for (var i = 0; i &lt; groups.length; i++)
+                       for (let i = 0; i &lt; groups.length; i++)
                                this.initTabGroup(groups[i]);
 
                        document.addEventListener('dependency-update', this.updateTabs.bind(this));
@@ -7748,22 +7781,22 @@ var UI = baseclass.extend(/** @lends LuCI.ui.prototype */ {
                 * of a `querySelectorAll()` call or the `.childNodes` property of a
                 * DOM node.
                 */
-               initTabGroup: function(panes) {
+               initTabGroup(panes) {
                        if (typeof(panes) != 'object' || !('length' in panes) || panes.length === 0)
                                return;
 
-                       var menu = E('ul', { 'class': 'cbi-tabmenu' }),
-                           group = panes[0].parentNode,
-                           groupId = +group.getAttribute('data-tab-group'),
-                           selected = null;
+                       const menu = E('ul', { 'class': 'cbi-tabmenu' });
+                       const group = panes[0].parentNode;
+                       const groupId = +group.getAttribute('data-tab-group');
+                       let selected = null;
 
                        if (group.getAttribute('data-initialized') === 'true')
                                return;
 
-                       for (var i = 0, pane; pane = panes[i]; i++) {
-                               var name = pane.getAttribute('data-tab'),
-                                   title = pane.getAttribute('data-tab-title'),
-                                   active = pane.getAttribute('data-tab-active') === 'true';
+                       for (let i = 0, pane; pane = panes[i]; i++) {
+                               const name = pane.getAttribute('data-tab');
+                               const title = pane.getAttribute('data-tab-title');
+                               const active = pane.getAttribute('data-tab-active') === 'true';
 
                                menu.appendChild(E('li', {
                                        'style': this.isEmptyPane(pane) ? 'display:none' : null,
@@ -7785,7 +7818,7 @@ var UI = baseclass.extend(/** @lends LuCI.ui.prototype */ {
                                selected = this.getActiveTabId(panes[0]);
 
                                if (selected &lt; 0 || selected >= panes.length || this.isEmptyPane(panes[selected])) {
-                                       for (var i = 0; i &lt; panes.length; i++) {
+                                       for (let i = 0; i &lt; panes.length; i++) {
                                                if (!this.isEmptyPane(panes[i])) {
                                                        selected = i;
                                                        break;
@@ -7800,7 +7833,7 @@ var UI = baseclass.extend(/** @lends LuCI.ui.prototype */ {
                                this.setActiveTabId(panes[selected], selected);
                        }
 
-                       requestAnimationFrame(L.bind(function(pane) {
+                       requestAnimationFrame(L.bind(pane => {
                                pane.dispatchEvent(new CustomEvent('cbi-tab-active', {
                                        detail: { tab: pane.getAttribute('data-tab') }
                                }));
@@ -7820,13 +7853,14 @@ var UI = baseclass.extend(/** @lends LuCI.ui.prototype */ {
                 * @returns {boolean}
                 * Returns `true` if the pane is empty, else `false`.
                 */
-               isEmptyPane: function(pane) {
-                       return dom.isEmpty(pane, function(n) { return n.classList.contains('cbi-tab-descr') });
+               isEmptyPane(pane) {
+                       return dom.isEmpty(pane, n => n.classList.contains('cbi-tab-descr'));
                },
 
                /** @private */
-               getPathForPane: function(pane) {
-                       var path = [], node = null;
+               getPathForPane(pane) {
+                       const path = [];
+                       let node = null;
 
                        for (node = pane ? pane.parentNode : null;
                             node != null &amp;&amp; node.hasAttribute != null;
@@ -7842,9 +7876,9 @@ var UI = baseclass.extend(/** @lends LuCI.ui.prototype */ {
                },
 
                /** @private */
-               getActiveTabState: function() {
-                       var page = document.body.getAttribute('data-page'),
-                           state = session.getLocalData('tab');
+               getActiveTabState() {
+                       const page = document.body.getAttribute('data-page');
+                       const state = session.getLocalData('tab');
 
                        if (L.isObject(state) &amp;&amp; state.page === page &amp;&amp; L.isObject(state.paths))
                                return state;
@@ -7855,15 +7889,15 @@ var UI = baseclass.extend(/** @lends LuCI.ui.prototype */ {
                },
 
                /** @private */
-               getActiveTabId: function(pane) {
-                       var path = this.getPathForPane(pane);
-                       return +this.getActiveTabState().paths[path] || 0;
+               getActiveTabId(pane) {
+                       const path = this.getPathForPane(pane);
+                       return +this.getActiveTabState().paths[path] ?? 0;
                },
 
                /** @private */
-               setActiveTabId: function(pane, tabIndex) {
-                       var path = this.getPathForPane(pane),
-                           state = this.getActiveTabState();
+               setActiveTabId(pane, tabIndex) {
+                       const path = this.getPathForPane(pane);
+                       const state = this.getActiveTabState();
 
                        state.paths[path] = tabIndex;
 
@@ -7871,11 +7905,11 @@ var UI = baseclass.extend(/** @lends LuCI.ui.prototype */ {
                },
 
                /** @private */
-               updateTabs: function(ev, root) {
-                       (root || document).querySelectorAll('[data-tab-title]').forEach(L.bind(function(pane) {
-                               var menu = pane.parentNode.previousElementSibling,
-                                   tab = menu ? menu.querySelector('[data-tab="%s"]'.format(pane.getAttribute('data-tab'))) : null,
-                                   n_errors = pane.querySelectorAll('.cbi-input-invalid').length;
+               updateTabs(ev, root) {
+                       (root ?? document).querySelectorAll('[data-tab-title]').forEach(L.bind((pane) => {
+                               const menu = pane.parentNode.previousElementSibling;
+                               const tab = menu ? menu.querySelector('[data-tab="%s"]'.format(pane.getAttribute('data-tab'))) : null;
+                               const n_errors = pane.querySelectorAll('.cbi-input-invalid').length;
 
                                if (!menu || !tab)
                                        return;
@@ -7886,7 +7920,7 @@ var UI = baseclass.extend(/** @lends LuCI.ui.prototype */ {
                                }
                                else if (tab.style.display === 'none') {
                                        tab.style.display = '';
-                                       requestAnimationFrame(function() { tab.classList.add('flash') });
+                                       requestAnimationFrame(() => tab.classList.add('flash'));
                                }
 
                                if (n_errors) {
@@ -7902,27 +7936,27 @@ var UI = baseclass.extend(/** @lends LuCI.ui.prototype */ {
                },
 
                /** @private */
-               switchTab: function(ev) {
-                       var tab = ev.target.parentNode,
-                           name = tab.getAttribute('data-tab'),
-                           menu = tab.parentNode,
-                           group = menu.nextElementSibling,
-                           groupId = +group.getAttribute('data-tab-group'),
-                           index = 0;
+               switchTab(ev) {
+                       const tab = ev.target.parentNode;
+                       const name = tab.getAttribute('data-tab');
+                       const menu = tab.parentNode;
+                       const group = menu.nextElementSibling;
+                       const groupId = +group.getAttribute('data-tab-group');
+                       let index = 0;
 
                        ev.preventDefault();
 
                        if (!tab.classList.contains('cbi-tab-disabled'))
                                return;
 
-                       menu.querySelectorAll('[data-tab]').forEach(function(tab) {
+                       menu.querySelectorAll('[data-tab]').forEach(tab => {
                                tab.classList.remove('cbi-tab');
                                tab.classList.remove('cbi-tab-disabled');
                                tab.classList.add(
                                        tab.getAttribute('data-tab') === name ? 'cbi-tab' : 'cbi-tab-disabled');
                        });
 
-                       group.childNodes.forEach(function(pane) {
+                       group.childNodes.forEach(pane => {
                                if (dom.matches(pane, '[data-tab]')) {
                                        if (pane.getAttribute('data-tab') === name) {
                                                pane.setAttribute('data-tab-active', 'true');
@@ -7967,98 +8001,103 @@ var UI = baseclass.extend(/** @lends LuCI.ui.prototype */ {
         * or rejecting with an error in case the upload failed or has been
         * cancelled by the user.
         */
-       uploadFile: function(path, progressStatusNode) {
-               return new Promise(function(resolveFn, rejectFn) {
+       uploadFile(path, progressStatusNode) {
+               return new Promise((resolveFn, rejectFn) => {
                        UI.prototype.showModal(_('Uploading file…'), [
                                E('p', _('Please select the file to upload.')),
-                               E('div', { 'class': 'button-row' }, [
-                                       E('button', {
-                                               'class': 'btn cbi-button',
-                                               'click': function() {
-                                                       UI.prototype.hideModal();
-                                                       rejectFn(new Error(_('Upload has been cancelled')));
-                                               }
-                                       }, [ _('Cancel') ]),
-                                       E('input', {
-                                               type: 'file',
-                                               style: 'display:none',
-                                               change: function(ev) {
-                                                       var modal = dom.parent(ev.target, '.modal'),
-                                                           body = modal.querySelector('p'),
-                                                           upload = modal.querySelector('.cbi-button-action.important'),
-                                                           file = ev.currentTarget.files[0];
-
-                                                       if (file == null)
-                                                               return;
-
-                                                       dom.content(body, [
-                                                               E('ul', {}, [
-                                                                       E('li', {}, [ '%s: %s'.format(_('Name'), file.name.replace(/^.*[\\\/]/, '')) ]),
-                                                                       E('li', {}, [ '%s: %1024mB'.format(_('Size'), file.size) ])
-                                                               ])
-                                                       ]);
-
-                                                       upload.disabled = false;
-                                                       upload.focus();
-                                               }
-                                       }),
-                                       E('button', {
-                                               'class': 'btn cbi-button',
-                                               'click': function(ev) {
-                                                       ev.target.previousElementSibling.click();
-                                               }
-                                       }, [ _('Browse…') ]),
-                                       E('button', {
-                                               'class': 'btn cbi-button-action important',
-                                               'disabled': true,
-                                               'click': function(ev) {
-                                                       var input = dom.parent(ev.target, '.modal').querySelector('input[type="file"]');
-
-                                                       if (!input.files[0])
-                                                               return;
-
-                                                       var progress = E('div', { 'class': 'cbi-progressbar', 'title': '0%' }, E('div', { 'style': 'width:0' }));
-
-                                                       UI.prototype.showModal(_('Uploading file…'), [ progress ]);
-
-                                                       var data = new FormData();
-
-                                                       data.append('sessionid', rpc.getSessionID());
-                                                       data.append('filename', path);
-                                                       data.append('filedata', input.files[0]);
-
-                                                       var filename = input.files[0].name;
-
-                                                       request.post(L.env.cgi_base + '/cgi-upload', data, {
-                                                               timeout: 0,
-                                                               progress: function(pev) {
-                                                                       var percent = (pev.loaded / pev.total) * 100;
-
-                                                                       if (progressStatusNode)
-                                                                               progressStatusNode.data = '%.2f%%'.format(percent);
-
-                                                                       progress.setAttribute('title', '%.2f%%'.format(percent));
-                                                                       progress.firstElementChild.style.width = '%.2f%%'.format(percent);
-                                                               }
-                                                       }).then(function(res) {
-                                                               var reply = res.json();
-
+                               E('div', { 'style': 'display:flex' }, [
+                                       E('div', { 'class': 'left', 'style': 'flex:1' }, [
+                                               E('input', {
+                                                       type: 'file',
+                                                       style: 'display:none',
+                                                       change(ev) {
+                                                               const modal = dom.parent(ev.target, '.modal');
+                                                               const body = modal.querySelector('p');
+                                                               const upload = modal.querySelector('.cbi-button-action.important');
+                                                               const file = ev.currentTarget.files[0];
+
+                                                               if (file == null)
+                                                                       return;
+
+                                                               dom.content(body, [
+                                                                       E('ul', {}, [
+                                                                               E('li', {}, [ '%s: %s'.format(_('Name'), file.name.replace(/^.*[\\\/]/, '')) ]),
+                                                                               E('li', {}, [ '%s: %1024mB'.format(_('Size'), file.size) ])
+                                                                       ])
+                                                               ]);
+
+                                                               upload.disabled = false;
+                                                               upload.focus();
+                                                       }
+                                               }),
+                                               E('button', {
+                                                       'class': 'btn cbi-button',
+                                                       'click': function(ev) {
+                                                               ev.target.previousElementSibling.click();
+                                                       }
+                                               }, [ _('Browse…') ])
+                                       ]),
+                                       E('div', { 'class': 'right', 'style': 'flex:1' }, [
+                                               E('button', {
+                                                       'class': 'btn',
+                                                       'click': function() {
                                                                UI.prototype.hideModal();
-
-                                                               if (L.isObject(reply) &amp;&amp; reply.failure) {
-                                                                       UI.prototype.addNotification(null, E('p', _('Upload request failed: %s').format(reply.message)));
-                                                                       rejectFn(new Error(reply.failure));
-                                                               }
-                                                               else {
-                                                                       reply.name = filename;
-                                                                       resolveFn(reply);
-                                                               }
-                                                       }, function(err) {
-                                                               UI.prototype.hideModal();
-                                                               rejectFn(err);
-                                                       });
-                                               }
-                                       }, [ _('Upload') ])
+                                                               rejectFn(new Error(_('Upload has been cancelled')));
+                                                       }
+                                               }, [ _('Cancel') ]),
+                                               ' ',
+                                               E('button', {
+                                                       'class': 'btn cbi-button-action important',
+                                                       'disabled': true,
+                                                       'click': function(ev) {
+                                                               const input = dom.parent(ev.target, '.modal').querySelector('input[type="file"]');
+
+                                                               if (!input.files[0])
+                                                                       return;
+
+                                                               const progress = E('div', { 'class': 'cbi-progressbar', 'title': '0%' }, E('div', { 'style': 'width:0' }));
+
+                                                               UI.prototype.showModal(_('Uploading file…'), [ progress ]);
+
+                                                               const data = new FormData();
+
+                                                               data.append('sessionid', rpc.getSessionID());
+                                                               data.append('filename', path);
+                                                               data.append('filedata', input.files[0]);
+
+                                                               const filename = input.files[0].name;
+
+                                                               request.post(`${L.env.cgi_base}/cgi-upload`, data, {
+                                                                       timeout: 0,
+                                                                       progress(pev) {
+                                                                               const percent = (pev.loaded / pev.total) * 100;
+
+                                                                               if (progressStatusNode)
+                                                                                       progressStatusNode.data = '%.2f%%'.format(percent);
+
+                                                                               progress.setAttribute('title', '%.2f%%'.format(percent));
+                                                                               progress.firstElementChild.style.width = '%.2f%%'.format(percent);
+                                                                       }
+                                                               }).then(res => {
+                                                                       const reply = res.json();
+
+                                                                       UI.prototype.hideModal();
+
+                                                                       if (L.isObject(reply) &amp;&amp; reply.failure) {
+                                                                               UI.prototype.addNotification(null, E('p', _('Upload request failed: %s').format(reply.message)));
+                                                                               rejectFn(new Error(reply.failure));
+                                                                       }
+                                                                       else {
+                                                                               reply.name = filename;
+                                                                               resolveFn(reply);
+                                                                       }
+                                                               }, err => {
+                                                                       UI.prototype.hideModal();
+                                                                       rejectFn(err);
+                                                               });
+                                                       }
+                                               }, [ _('Upload') ])
+                                       ])
                                ])
                        ]);
                });
@@ -8084,11 +8123,11 @@ var UI = baseclass.extend(/** @lends LuCI.ui.prototype */ {
         * reachable or rejecting with an `error` event in case it is not reachable
         * or rejecting with `null` when the connectivity check timed out.
         */
-       pingDevice: function(proto, ipaddr) {
-               var target = '%s://%s%s?%s'.format(proto || 'http', ipaddr || window.location.host, L.resource('icons/loading.gif'), Math.random());
+       pingDevice(proto, ipaddr) {
+               const target = '%s://%s%s?%s'.format(proto ?? 'http', ipaddr ?? window.location.host, L.resource('icons/loading.gif'), Math.random());
 
-               return new Promise(function(resolveFn, rejectFn) {
-                       var img = new Image();
+               return new Promise((resolveFn, rejectFn) => {
+                       const img = new Image();
 
                        img.onload = resolveFn;
                        img.onerror = rejectFn;
@@ -8110,19 +8149,20 @@ var UI = baseclass.extend(/** @lends LuCI.ui.prototype */ {
         * If omitted, the current value of `window.location.host` is used by
         * default.
         */
-       awaitReconnect: function(/* ... */) {
-               var ipaddrs = arguments.length ? arguments : [ window.location.host ];
+       awaitReconnect(...hosts) {
+               const ipaddrs = hosts.length ? hosts : [ window.location.host ];
 
-               window.setTimeout(L.bind(function() {
-                       poll.add(L.bind(function() {
-                               var tasks = [], reachable = false;
+               window.setTimeout(L.bind(() => {
+                       poll.add(L.bind(() => {
+                               const tasks = [];
+                               let reachable = false;
 
-                               for (var i = 0; i &lt; 2; i++)
-                                       for (var j = 0; j &lt; ipaddrs.length; j++)
+                               for (let i = 0; i &lt; 2; i++)
+                                       for (let j = 0; j &lt; ipaddrs.length; j++)
                                                tasks.push(this.pingDevice(i ? 'https' : 'http', ipaddrs[j])
-                                                       .then(function(ev) { reachable = ev.target.src.replace(/^(https?:\/\/[^\/]+).*$/, '$1/') }, function() {}));
+                                                       .then(ev => { reachable = ev.target.src.replace(/^(https?:\/\/[^\/]+).*$/, '$1/') }, () => {}));
 
-                               return Promise.all(tasks).then(function() {
+                               return Promise.all(tasks).then(() => {
                                        if (reachable) {
                                                poll.stop();
                                                window.location = reachable;
@@ -8147,7 +8187,7 @@ var UI = baseclass.extend(/** @lends LuCI.ui.prototype */ {
         * `changes` property of the class instance value.
         */
        changes: baseclass.singleton(/* @lends LuCI.ui.changes.prototype */ {
-               init: function() {
+               init() {
                        if (!L.env.sessionid)
                                return;
 
@@ -8167,7 +8207,7 @@ var UI = baseclass.extend(/** @lends LuCI.ui.prototype */ {
                 * @param {number} n
                 * The number of changes to indicate.
                 */
-               setIndicator: function(n) {
+               setIndicator(n) {
                        if (n > 0) {
                                UI.prototype.showIndicator('uci-changes',
                                        '%s: %d'.format(_('Unsaved Changes'), n),
@@ -8189,10 +8229,10 @@ var UI = baseclass.extend(/** @lends LuCI.ui.prototype */ {
                 * @param {Object&lt;string, Array&lt;LuCI.uci.ChangeRecord>>} changes
                 * The UCI changeset to count.
                 */
-               renderChangeIndicator: function(changes) {
-                       var n_changes = 0;
+               renderChangeIndicator(changes) {
+                       let n_changes = 0;
 
-                       for (var config in changes)
+                       for (const config in changes)
                                if (changes.hasOwnProperty(config))
                                        n_changes += changes[config].length;
 
@@ -8223,24 +8263,23 @@ var UI = baseclass.extend(/** @lends LuCI.ui.prototype */ {
                 * @instance
                 * @memberof LuCI.ui.changes
                 */
-               displayChanges: function() {
-                       var list = E('div', { 'class': 'uci-change-list' }),
-                           dlg = UI.prototype.showModal(_('Configuration') + ' / ' + _('Changes'), [
-                               E('div', { 'class': 'cbi-section' }, [
-                                       E('strong', _('Legend:')),
-                                       E('div', { 'class': 'uci-change-legend' }, [
-                                               E('div', { 'class': 'uci-change-legend-label' }, [
-                                                       E('ins', '&amp;#160;'), ' ', _('Section added') ]),
-                                               E('div', { 'class': 'uci-change-legend-label' }, [
-                                                       E('del', '&amp;#160;'), ' ', _('Section removed') ]),
-                                               E('div', { 'class': 'uci-change-legend-label' }, [
-                                                       E('var', {}, E('ins', '&amp;#160;')), ' ', _('Option changed') ]),
-                                               E('div', { 'class': 'uci-change-legend-label' }, [
-                                                       E('var', {}, E('del', '&amp;#160;')), ' ', _('Option removed') ])]),
-                                       E('br'),
-                                       list,
-                               ]),
-                               E('div', { 'class': 'button-row' }, [
+               displayChanges() {
+                       const list = E('div', { 'class': 'uci-change-list' });
+
+                       const dlg = UI.prototype.showModal(`${_('Configuration')} / ${_('Changes')}`, [
+                       E('div', { 'class': 'cbi-section' }, [
+                               E('strong', _('Legend:')),
+                               E('div', { 'class': 'uci-change-legend' }, [
+                                       E('div', { 'class': 'uci-change-legend-label' }, [
+                                               E('ins', '&amp;#160;'), ' ', _('Section added') ]),
+                                       E('div', { 'class': 'uci-change-legend-label' }, [
+                                               E('del', '&amp;#160;'), ' ', _('Section removed') ]),
+                                       E('div', { 'class': 'uci-change-legend-label' }, [
+                                               E('var', {}, E('ins', '&amp;#160;')), ' ', _('Option changed') ]),
+                                       E('div', { 'class': 'uci-change-legend-label' }, [
+                                               E('var', {}, E('del', '&amp;#160;')), ' ', _('Option removed') ])]),
+                               E('br'), list,
+                               E('div', { 'class': 'right' }, [ //button-row?
                                        E('button', {
                                                'class': 'btn cbi-button',
                                                'click': UI.prototype.hideModal
@@ -8253,33 +8292,32 @@ var UI = baseclass.extend(/** @lends LuCI.ui.prototype */ {
                                                        0: 'btn cbi-button cbi-button-positive important',
                                                        1: 'btn cbi-button cbi-button-negative important'
                                                },
-                                               click: L.bind(function(ev, mode) { this.apply(mode == '0') }, this)
+                                               click: L.bind((ev, mode) => { this.apply(mode == '0') }, this)
                                        }).render(), ' ',
                                        E('button', {
                                                'class': 'btn cbi-button cbi-button-reset',
                                                'click': L.bind(this.revert, this)
-                                       }, [ _('Revert') ])
-                               ])
-                       ]);
+                                       }, [ _('Revert') ])])])
+               ]);
 
-                       for (var config in this.changes) {
+                       for (const config in this.changes) {
                                if (!this.changes.hasOwnProperty(config))
                                        continue;
 
                                list.appendChild(E('h5', '# /etc/config/%s'.format(config)));
 
-                               for (var i = 0, added = null; i &lt; this.changes[config].length; i++) {
-                                       var chg = this.changes[config][i],
-                                           tpl = this.changeTemplates['%s-%d'.format(chg[0], chg.length)];
+                               for (let i = 0, added = null; i &lt; this.changes[config].length; i++) {
+                                       const chg = this.changes[config][i];
+                                       const tpl = this.changeTemplates['%s-%d'.format(chg[0], chg.length)];
 
-                                       list.appendChild(E(tpl.replace(/%([01234])/g, function(m0, m1) {
+                                       list.appendChild(E(tpl.replace(/%([01234])/g, (m0, m1) => {
                                                switch (+m1) {
                                                case 0:
                                                        return config;
 
                                                case 2:
                                                        if (added != null &amp;&amp; chg[1] == added[0])
-                                                               return '@' + added[1] + '[-1]';
+                                                               return `@${added[1]}[-1]`;
                                                        else
                                                                return chg[1];
 
@@ -8301,9 +8339,9 @@ var UI = baseclass.extend(/** @lends LuCI.ui.prototype */ {
                },
 
                /** @private */
-               displayStatus: function(type, content) {
+               displayStatus(type, content) {
                        if (type) {
-                               var message = UI.prototype.showModal('', '');
+                               const message = UI.prototype.showModal('', '');
 
                                message.classList.add('alert-message');
                                DOMTokenList.prototype.add.apply(message.classList, type.split(/\s+/));
@@ -8325,14 +8363,14 @@ var UI = baseclass.extend(/** @lends LuCI.ui.prototype */ {
                },
 
                /** @private */
-               checkConnectivityAffected: function() {
-                       return L.resolveDefault(fs.exec_direct('/usr/libexec/luci-peeraddr', null, 'json')).then(L.bind(function(info) {
+               checkConnectivityAffected() {
+                       return L.resolveDefault(fs.exec_direct('/usr/libexec/luci-peeraddr', null, 'json')).then(L.bind((info) => {
                                if (L.isObject(info) &amp;&amp; Array.isArray(info.inbound_interfaces)) {
-                                       for (var i = 0; i &lt; info.inbound_interfaces.length; i++) {
-                                               var iif = info.inbound_interfaces[i];
+                                       for (let i = 0; i &lt; info.inbound_interfaces.length; i++) {
+                                               const iif = info.inbound_interfaces[i];
 
-                                               for (var j = 0; this.changes &amp;&amp; this.changes.network &amp;&amp; j &lt; this.changes.network.length; j++) {
-                                                       var chg = this.changes.network[j];
+                                               for (let j = 0; this.changes &amp;&amp; this.changes.network &amp;&amp; j &lt; this.changes.network.length; j++) {
+                                                       const chg = this.changes.network[j];
 
                                                        if (chg[0] == 'set' &amp;&amp; chg[1] == iif &amp;&amp;
                                                                ((chg[2] == 'disabled' &amp;&amp; chg[3] == '1') || chg[2] == 'proto' || chg[2] == 'ipaddr' || chg[2] == 'netmask'))
@@ -8346,13 +8384,13 @@ var UI = baseclass.extend(/** @lends LuCI.ui.prototype */ {
                },
 
                /** @private */
-               rollback: function(checked) {
+               rollback(checked) {
                        if (checked) {
                                this.displayStatus('warning spinning',
                                        E('p', _('Failed to confirm apply within %ds, waiting for rollback…')
                                                .format(L.env.apply_rollback)));
 
-                               var call = function(r) {
+                               const call = (r, data, duration) => {
                                        if (r.status === 204) {
                                                UI.prototype.changes.displayStatus('warning', [
                                                        E('h4', _('Configuration changes have been rolled back!')),
@@ -8376,8 +8414,8 @@ var UI = baseclass.extend(/** @lends LuCI.ui.prototype */ {
                                                return;
                                        }
 
-                                       var delay = isNaN(r.duration) ? 0 : Math.max(1000 - r.duration, 0);
-                                       window.setTimeout(function() {
+                                       const delay = isNaN(duration) ? 0 : Math.max(1000 - duration, 0);
+                                       window.setTimeout(() => {
                                                request.request(L.url('admin/uci/confirm'), {
                                                        method: 'post',
                                                        timeout: L.env.apply_timeout * 1000,
@@ -8397,16 +8435,16 @@ var UI = baseclass.extend(/** @lends LuCI.ui.prototype */ {
                },
 
                /** @private */
-               confirm: function(checked, deadline, override_token) {
-                       var tt;
-                       var ts = Date.now();
+               confirm(checked, deadline, override_token) {
+                       let tt;
+                       let ts = Date.now();
 
                        this.displayStatus('notice');
 
                        if (override_token)
                                this.confirm_auth = { token: override_token };
 
-                       var call = function(r) {
+                       const call = (r, data, duration) => {
                                if (Date.now() >= deadline) {
                                        window.clearTimeout(tt);
                                        UI.prototype.changes.rollback(checked);
@@ -8420,7 +8458,7 @@ var UI = baseclass.extend(/** @lends LuCI.ui.prototype */ {
                                                E('p', _('Configuration changes applied.')));
 
                                        window.clearTimeout(tt);
-                                       window.setTimeout(function() {
+                                       window.setTimeout(() => {
                                                //UI.prototype.changes.displayStatus(false);
                                                window.location = window.location.href.split('#')[0];
                                        }, L.env.apply_display * 1000);
@@ -8428,8 +8466,8 @@ var UI = baseclass.extend(/** @lends LuCI.ui.prototype */ {
                                        return;
                                }
 
-                               var delay = isNaN(r.duration) ? 0 : Math.max(1000 - r.duration, 0);
-                               window.setTimeout(function() {
+                               const delay = isNaN(duration) ? 0 : Math.max(1000 - duration, 0);
+                               window.setTimeout(() => {
                                        request.request(L.url('admin/uci/confirm'), {
                                                method: 'post',
                                                timeout: L.env.apply_timeout * 1000,
@@ -8438,8 +8476,8 @@ var UI = baseclass.extend(/** @lends LuCI.ui.prototype */ {
                                }, delay);
                        };
 
-                       var tick = function() {
-                               var now = Date.now();
+                       const tick = () => {
+                               const now = Date.now();
 
                                UI.prototype.changes.displayStatus('notice spinning',
                                        E('p', _('Applying configuration changes… %ds')
@@ -8478,15 +8516,15 @@ var UI = baseclass.extend(/** @lends LuCI.ui.prototype */ {
                 * will begin to roll back the changes in order to restore the previous
                 * settings.
                 */
-               apply: function(checked) {
+               apply(checked) {
                        this.displayStatus('notice spinning',
                                E('p', _('Starting configuration apply…')));
 
-                       (new Promise(function(resolveFn, rejectFn) {
+                       (new Promise((resolveFn, rejectFn) => {
                                if (!checked)
                                        return resolveFn(false);
 
-                               UI.prototype.changes.checkConnectivityAffected().then(function(affected) {
+                               UI.prototype.changes.checkConnectivityAffected().then(affected => {
                                        if (!affected)
                                                return resolveFn(true);
 
@@ -8509,13 +8547,13 @@ var UI = baseclass.extend(/** @lends LuCI.ui.prototype */ {
                                                ])
                                        ]);
                                });
-                       })).then(function(checked) {
+                       })).then(checked => {
                                request.request(L.url('admin/uci', checked ? 'apply_rollback' : 'apply_unchecked'), {
                                        method: 'post',
                                        query: { sid: L.env.sessionid, token: L.env.token }
-                               }).then(function(r) {
+                               }).then(r => {
                                        if (r.status === (checked ? 200 : 204)) {
-                                               var tok = null; try { tok = r.json(); } catch(e) {}
+                                               let tok = null; try { tok = r.json(); } catch(e) {}
                                                if (checked &amp;&amp; tok !== null &amp;&amp; typeof(tok) === 'object' &amp;&amp; typeof(tok.token) === 'string')
                                                        UI.prototype.changes.confirm_auth = tok;
 
@@ -8525,16 +8563,16 @@ var UI = baseclass.extend(/** @lends LuCI.ui.prototype */ {
                                                UI.prototype.changes.displayStatus('notice',
                                                        E('p', _('There are no changes to apply')));
 
-                                               window.setTimeout(function() {
+                                               window.setTimeout(() => {
                                                        UI.prototype.changes.displayStatus(false);
                                                }, L.env.apply_display * 1000);
                                        }
                                        else {
                                                UI.prototype.changes.displayStatus('warning',
                                                        E('p', _('Apply request failed with status &lt;code>%h&lt;/code>')
-                                                               .format(r.responseText || r.statusText || r.status)));
+                                                               .format(r.responseText ?? r.statusText ?? r.status)));
 
-                                               window.setTimeout(function() {
+                                               window.setTimeout(() => {
                                                        UI.prototype.changes.displayStatus(false);
                                                }, L.env.apply_display * 1000);
                                        }
@@ -8554,14 +8592,14 @@ var UI = baseclass.extend(/** @lends LuCI.ui.prototype */ {
                 * @instance
                 * @memberof LuCI.ui.changes
                 */
-               revert: function() {
+               revert() {
                        this.displayStatus('notice spinning',
                                E('p', _('Reverting configuration…')));
 
                        request.request(L.url('admin/uci/revert'), {
                                method: 'post',
                                query: { sid: L.env.sessionid, token: L.env.token }
-                       }).then(function(r) {
+                       }).then(r => {
                                if (r.status === 200) {
                                        document.dispatchEvent(new CustomEvent('uci-reverted'));
 
@@ -8569,7 +8607,7 @@ var UI = baseclass.extend(/** @lends LuCI.ui.prototype */ {
                                        UI.prototype.changes.displayStatus('notice',
                                                E('p', _('Changes have been reverted.')));
 
-                                       window.setTimeout(function() {
+                                       window.setTimeout(() => {
                                                //UI.prototype.changes.displayStatus(false);
                                                window.location = window.location.href.split('#')[0];
                                        }, L.env.apply_display * 1000);
@@ -8577,9 +8615,9 @@ var UI = baseclass.extend(/** @lends LuCI.ui.prototype */ {
                                else {
                                        UI.prototype.changes.displayStatus('warning',
                                                E('p', _('Revert request failed with status &lt;code>%h&lt;/code>')
-                                                       .format(r.statusText || r.status)));
+                                                       .format(r.statusText ?? r.status)));
 
-                                       window.setTimeout(function() {
+                                       window.setTimeout(() => {
                                                UI.prototype.changes.displayStatus(false);
                                        }, L.env.apply_display * 1000);
                                }
@@ -8622,19 +8660,18 @@ var UI = baseclass.extend(/** @lends LuCI.ui.prototype */ {
         *
         * @see LuCI.validation
         */
-       addValidator: function(field, type, optional, vfunc /*, ... */) {
+       addValidator(field, type, optional, vfunc, ...events) {
                if (type == null)
                        return;
 
-               var events = this.varargs(arguments, 3);
                if (events.length == 0)
                        events.push('blur', 'keyup');
 
                try {
-                       var cbiValidator = validation.create(field, type, optional, vfunc),
-                           validatorFn = cbiValidator.validate.bind(cbiValidator);
+                       const cbiValidator = validation.create(field, type, optional, vfunc);
+                       const validatorFn = cbiValidator.validate.bind(cbiValidator);
 
-                       for (var i = 0; i &lt; events.length; i++)
+                       for (let i = 0; i &lt; events.length; i++)
                                field.addEventListener(events[i], validatorFn);
 
                        validatorFn();
@@ -8673,17 +8710,15 @@ var UI = baseclass.extend(/** @lends LuCI.ui.prototype */ {
         * a string which could not be found in `ctx` or if `ctx[fn]` is not a
         * valid function value.
         */
-       createHandlerFn: function(ctx, fn /*, ... */) {
+       createHandlerFn(ctx, fn, ...args) {
                if (typeof(fn) == 'string')
                        fn = ctx[fn];
 
                if (typeof(fn) != 'function')
                        return null;
 
-               var arg_offset = arguments.length - 2;
-
-               return Function.prototype.bind.apply(function() {
-                       var t = arguments[arg_offset].currentTarget;
+               return L.bind(function() {
+                       const t = arguments[args.length].currentTarget;
 
                        t.classList.add('spinning');
                        t.disabled = true;
@@ -8691,11 +8726,11 @@ var UI = baseclass.extend(/** @lends LuCI.ui.prototype */ {
                        if (t.blur)
                                t.blur();
 
-                       Promise.resolve(fn.apply(ctx, arguments)).finally(function() {
+                       Promise.resolve(fn.apply(ctx, arguments)).finally(() => {
                                t.classList.remove('spinning');
                                t.disabled = false;
                        });
-               }, this.varargs(arguments, 2, ctx));
+               }, ctx, ...args);
        },
 
        /**
@@ -8716,15 +8751,15 @@ var UI = baseclass.extend(/** @lends LuCI.ui.prototype */ {
         * @returns {Promise&lt;LuCI.view>}
         * Returns a promise resolving to the loaded view instance.
         */
-       instantiateView: function(path) {
-               var className = 'view.%s'.format(path.replace(/\//g, '.'));
+       instantiateView(path) {
+               const className = 'view.%s'.format(path.replace(/\//g, '.'));
 
-               return L.require(className).then(function(view) {
+               return L.require(className).then(view => {
                        if (!(view instanceof View))
                                throw new TypeError('Loaded class %s is not a descendant of View'.format(className));
 
                        return view;
-               }).catch(function(err) {
+               }).catch(err => {
                        dom.content(document.querySelector('#view'), null);
                        L.error(err);
                });
@@ -8762,7 +8797,7 @@ return UI;
         
 
         <footer>
-            Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Thu Dec 19 2024 19:20:35 GMT+0000 (Coordinated Universal Time)
+            Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Fri Dec 20 2024 00:14:55 GMT+0000 (Coordinated Universal Time)
         </footer>
     </div>
 </div>